복붙노트

[SQL] SET NOCOUNT ON 사용

SQL

SET NOCOUNT ON 사용

SET NOCOUNT에 대해 의견이 다른되는이 질문에 영감을 ...

그것은 편집 6 일 22 7월 무엇을

그것은 어떤 DML 후 메시지를 "XX 행이 영향을"억제한다. 이 결과 집합이며, 보낼 때, 클라이언트는 그것을 처리해야합니다. 그것은 작은, 그러나 측정이다 (아래 답변을 참조)

트리거 등의 경우, 클라이언트는 여러 "XX 행이 영향"가 표시되고이 일부으로 ORMs, MS 액세스, JPA 등 (아래 편집 참조) 오류의 모든 종류의 원인

배경:

일반 모범 사례 (나는이 질문 할 때까지 생각) SQL Server의 트리거 및 저장 프로 시저에서 SET NOCOUNT ON을 사용하는 것입니다을 받아 들였다. 우리는 모든 곳에서 사용 및 SQL Server MVP가의 빠른 구글 쇼 충분히 너무 동의.

MSDN은이 닷넷 SqlDataAdapter를을 깰 수 있다고 말한다.

그것은 일치하는 메시지를 "N 행이 영향"기대 때문에 이제,이 수단 SqlDataAdapter를가 완전히 단순히 CRUD 처리로 제한된다. 그래서, 내가 사용할 수 없습니다 :

(자신의 SQL 물건을 알고있는 사람)라고 사용하지 않는 질문 marc_s합니다. 나는 생각이 다르다 (그리고 나도 SQL에서 어느 정도 능력으로 자신을 간주).

내가 뭔가 (명백한을 지적 해 주시기를) 누락 가능하지만, 거기에 생각에서 무슨 일이 당신에게 사람을합니까?

참고 : 나는 요즘 SqlDataAdapter를 사용하지 않기 때문에 나는이 오류를 본 이후 몇 년이되었습니다.

의견과 질문 후 편집 :

편집 : 더 생각을 ...

우리는 여러 클라이언트가 하나가 C # SQLDataAdaptor을 사용할 수 있습니다, 다른 자바에서 nHibernate 수를 사용할 수 있습니다. 이들은 SET NOCOUNT ON과 다른 방식으로 영향을받을 수 있습니다.

이 방법으로 저장 발동을 생각한다면, 그것은 나쁜 형태 (안티 패턴) 일부 내부 처리가 자신의 목적을 위해 특정 방식으로 작동합니다 가정합니다.

편집 2 : 트리거 파괴 자 NHibernate 질문, SET NOCOUNT ON이 설정 될 수 없습니다

(없이,이 중 중복이 아니다)

편집 3 : 아직 더 많은 정보 내 MVP 동료 덕분에

편집 4 : 2011 5월 13일

2 SQL Linq에 휴식도 때를 지정하지?

편집 5 : 2011 6월 14일

합니까 JPA 2.0 지원 SQL Server 테이블 변수 : 테이블 변수와 시저 저장 휴식 JPA?

편집 6 : 2011 8월 15일

SSMS "편집 행은"데이터 그리드는 SET NOCOUNT ON을 필요로 : GROUP BY와 업데이트 트리거를

편집 7 : 2013 3월 7일

더 @RemusRusanu에서 깊이 세부 사항 :합니까 SET NOCOUNT ON 정말 성능 차이의 정도를 만들

해결법

  1. ==============================

    1.좋아, 지금은 여기, 내 연구를 거래입니다했습니다 :

    좋아, 지금은 여기, 내 연구를 거래입니다했습니다 :

    텍스트 "SET NOCOUNT ON"자체가 14 바이트를 무려 동안 TDS 프로토콜에서 SET NOCOUNT ON에만 쿼리 당 9 바이트를 저장합니다. 내가 생각하는 데 사용하는 123 행 (들) 별도의 네트워크 패킷에 일반 텍스트로 서버에서 반환 된 영향을하지만, 그런 경우가 아니다. 그것은 사실 DONE_IN_PROC라는 작은 구조는 응답에 포함 된 것. 더 왕복이 낭비되지 않도록 별도의 네트워크 패킷이 아니다.

    난 당신이 성능에 대한 걱정없이 거의 항상 행동을 계산 기본값으로 스틱 수 있다고 생각합니다. 어떤 경우가 있습니다,하지만 행의 수를 계산 사전에 이러한 전진 전용 커서로, 성능에 영향을 미칠 것 곳. 이 경우 NOCOUNT은 필요 수 있습니다. 그 외에는, "사용 NOCOUNT 가능한"모토를 따라 할 필요는 전혀 없다.

    여기에 SET NOCOUNT 설정의 무의미에 대해 매우 자세한 분석은 다음과 같습니다 http://daleburnett.com/2014/01/everything-ever-wanted-know-set-nocount/

  2. ==============================

    2.내가 빠른 요약을 공유 할 거라고 생각 그래서, NOCOUNT 주변의 실제 벤치 마크 수치를 찾기 위해 파고의 나에게 많이했다.

    내가 빠른 요약을 공유 할 거라고 생각 그래서, NOCOUNT 주변의 실제 벤치 마크 수치를 찾기 위해 파고의 나에게 많이했다.

  3. ==============================

    3.SET NOCOUNT ON의 예 :

    SET NOCOUNT ON의 예 :

    SET NOCOUNT OFF의 예 :

  4. ==============================

    4.나는 그것이 DBA 대 개발자 문제의 어느 정도 같아요.

    나는 그것이 DBA 대 개발자 문제의 어느 정도 같아요.

    (Microsoft에서 문서화 된) 그것은 당신의 ADO.NET 코드를 깰 수 사용하기 때문에 - 주로 dev에, 나는 당신이 절대적으로 긍정적으로하지 않는 한 그것을 사용하지 말 것.

    그리고 난 당신이 다른 측면에 대한 자세한 것, DBA가 추측 - 가능하면 당신이 정말로 그것의 사용을 방지해야하지 않는 한 그것을 사용할 수 있습니다.

    당신의 DEVS 이제까지 ADO.NET의 ExecuteNonQuery 메서드 호출에 의해 반환되는 "하는 RecordsAffected"를 사용하는 경우 모든 사람이이 경우 이후 SET NOCOUNT ON을 사용하는 경우 또한, 당신이 문제에있어, ExecuteNonQuery는 항상 0을 반환합니다.

    또한 피터 브롬 버그의 블로그 게시물을보고 자신의 위치를 ​​확인하십시오.

    그것은 그래서 정말 기준을 설정할 수있는 사람을 아래로 비등 :-)

    즙을 짜고 난 찌꺼기

  5. ==============================

    5.당신은 당신이뿐만 아니라 다른 클라이언트가있을 수 있습니다 말을하는 경우 SET NOCOUNT가 ON으로 설정되어 있지 않은 경우, 고전적인 ADO에 문제가 있습니다.

    당신은 당신이뿐만 아니라 다른 클라이언트가있을 수 있습니다 말을하는 경우 SET NOCOUNT가 ON으로 설정되어 있지 않은 경우, 고전적인 ADO에 문제가 있습니다.

    한 나는 경험은 정기적으로 : 저장 프로 시저 명령문를 실행합니다 (따라서 메시지가 반환됩니다 "XXX 행이 영향을"의 수), ADO이 처리하지 않는 것 같습니다과 오류가 발생하는 경우 "Recordset 개체의 ActiveConnection 속성을 변경할 수 없습니다 어떤 소스로 Command 개체가 있습니다. "

    나는 일반적으로 정말 정말 좋은 이유가 존재하지 않는 한 ON으로 설정 옹호 그래서. 당신은 내가 가서 더으로 읽을 필요가 정말 정말 좋은 이유를 발견 할 수 있습니다.

  6. ==============================

    6.일을 더 복잡하게 만드는 위험에, 나는 모든 I 위에서 볼 것과 약간 다른 규칙을 장려 :

    일을 더 복잡하게 만드는 위험에, 나는 모든 I 위에서 볼 것과 약간 다른 규칙을 장려 :

    그래서 "일반적으로 당신이 실제로 결과 집합을 반환하는 경우를 제외하고, NOCOUNT에 계속". 나는 클라이언트 코드는 결코 PROC 내부에 대해 알 필요가 없다, 그것은 특히 부담없는 의미,이 모든 클라이언트 코드를 깰 수있는 방법을 모른다.

  7. ==============================

    7.NHibernate에 위반 트리거에 대해서, 그 경험을 첫 손이 있었다. NH 업데이트를 수행 할 때 기본적으로, 영향을받는 행의 특정 수를 예상하고있다. 트리거에 SET NOCOUNT ON을 추가하여 다시 NH함으로써 문제를 해결 기대했던에 행의 수를 얻을. 그래서 그래, 나는 확실히 당신이 NH을 사용하는 경우 트리거를 위해 전원을 끈 추천 할 것입니다.

    NHibernate에 위반 트리거에 대해서, 그 경험을 첫 손이 있었다. NH 업데이트를 수행 할 때 기본적으로, 영향을받는 행의 특정 수를 예상하고있다. 트리거에 SET NOCOUNT ON을 추가하여 다시 NH함으로써 문제를 해결 기대했던에 행의 수를 얻을. 그래서 그래, 나는 확실히 당신이 NH을 사용하는 경우 트리거를 위해 전원을 끈 추천 할 것입니다.

    SPS에서의 사용에 관해서는, 그것은 개인적인 취향의 문제이다. 난 항상 행 오프 계산 설정했지만, 다시, 실제 강력한 인수 중 하나의 방법이 없습니다.

    다른 메모에서, 당신은 정말 당신도이 문제가되지 않습니다, SP 기반 아키텍처에서 멀리 이동하는 것을 고려한다.

  8. ==============================

    8.나는 'SET NOCOUNT ON'은 네트워크 패킷이나 왕복을 저장하지 않는 자신을 확인하고 싶어

    나는 'SET NOCOUNT ON'은 네트워크 패킷이나 왕복을 저장하지 않는 자신을 확인하고 싶어

    내가 다른 호스트에서 테스트의 SQLServer 2017을 사용 (I는 VM 사용) ttable1 테이블 (INT N 개)을 생성; ,,,,,, ttable1 값 (1)에 (7) (6) (5) (4) (3) (2)를 삽입 가다 프로 시저 procNoCount를 만들 같이 시작   에 설정 NOCOUNT   N = 10, N 업데이트 ttable1 집합 종료 프로 시저 procNormal를 만들 같이 시작   N = 10, N 업데이트 ttable1 집합 종료 그럼 난 도구 '와이어 샤크'와 1433 포트에 패킷을 추적 : '캡처 필터'버튼 -> '포트 1433'

    간부 procNoCount

    이 응답 패킷이다 : 0000 00 50 56 00 08 00 C0 0C 3F 29 31 75 08 00 45 00 0010 00 42 D0 세륨 40 00 40 06 84 0 D 32 88 A8 C0 (C0)의 A8 0020 32 01 05 99 85 01 FE 50 18 FB 9c는 91 일 49 E5를 A5 0030 02 B4 E6의 0E 00 00 04 01 00 00 (1A) 35 01 00 79 00 0040 00 00 00 00 00 E0 (FE) 00 00 00 00 00 00 00 00 00

    간부 procNormal

    이 응답 패킷이다 : 0000 00 50 56 00 08 00 C0 0C 3F 29 31 75 08 00 45 00 0010 00 4F D0의 EA 40 00 40 06 83 32 88 E4 C0 (C0)의 A8 A8 0020 32 01 05 99 91 A5 FE는 49 E8 B1 FB 8A의 수 35 50 18 0030 03 02 E6 1B 00 00 04 01 00 27 00 35 01 00 11 FF C5 0040 00 00 07 00 00 00 00 00 00 00 79 00 00 00 00 FE 0050 00 00 E0 00 00 00 00 00 00 00 00 00

    라인 (40)상의 I '는 영향 행 (들)'의 개수 인 '07'을 참조 할 수있다. 그것은 응답 패킷에 포함되어 있습니다. 엑스트라 패킷 없습니다.

    그것은 ( 'MD'에, 예를 들어 'ManagingDepartment')하지 더 가치가 열 이름을 줄이는 것보다 아마 그러나 13 여분 저장 될 수 바이트 만이있다

    나는 성능을 위해 그것을 사용하는 이유를 볼 수 없습니다 그래서

    그러나 다른 사람들이 휴식 할 수 있습니다 언급 한 바와 같이 ADO.NET 나는 또한 파이썬을 사용하여 문제에 대한 발견 : MSSQL2008 - Pyodbc은 - 이전 SQL 쿼리 아니었다

    그래서 아마 여전히 좋은 습관 ...

  9. ==============================

    9.

    SET NOCOUNT ON;
    

    코드 행은 쿼리의 실행에 영향을 수 행을 반환하지 않는 SQL에 사용됩니다. 우리가 영향을받는 행의 수를 필요로하지 않는 경우에, 우리는 메모리 사용을 절약에 도움이 쿼리의 실행 speeed을 증가시킬 것이로 사용할 수 있습니다.

  10. ==============================

    10.SET NOCOUNT ON; 코드 위의 DML / DDL 명령 실행 후 프런 결과 창에 SQL 서버 엔진에 의해 생성 된 메시지를 중지합니다.

    SET NOCOUNT ON; 코드 위의 DML / DDL 명령 실행 후 프런 결과 창에 SQL 서버 엔진에 의해 생성 된 메시지를 중지합니다.

    우리는 왜 그것을 하는가? SQL 서버 엔진이 상태를 확인하고 메시지를 생성하는 몇 가지 리소스를 필요로, 그것은 engine.So 우리가에 noncount 메시지를 설정하는 SQL 서버에 과부하로 간주됩니다.

  11. ==============================

    11.SET NOCOUNT ON 정말 도움 당신은 루프 또는 커서에서 쿼리을하고있다 할 수있는 한 장소. 이렇게하면 네트워크 트래픽이 많이 추가 할 수 있습니다.

    SET NOCOUNT ON 정말 도움 당신은 루프 또는 커서에서 쿼리을하고있다 할 수있는 한 장소. 이렇게하면 네트워크 트래픽이 많이 추가 할 수 있습니다.

    CREATE PROCEDURE NoCountOn
    AS
    set nocount on
        DECLARE @num INT = 10000
        while @num > 0
        begin
           update MyTable SET SomeColumn=SomeColumn
           set @num = @num - 1
        end
    GO
    
    
    CREATE PROCEDURE NoCountOff
    AS
    set nocount off
        DECLARE @num INT = 10000
        while @num > 0
        begin
           update MyTable SET SomeColumn=SomeColumn
           set @num = @num - 1
        end
    GO
    

    SSMS에서 클라이언트 통계 켜기는 NoCountOff 하나에 추가 390킬로바이트 트래픽은 EXEC NoCountOn 및 EXEC NoCountOff 프로그램의 실행이 있었다는 것을 :

    아마 이상적이지는 루프 또는 커서에서 쿼리를 수행한다, 그러나 우리는 하나 이상적인 세계에 거주하지 않는 :)

  12. ==============================

    12.나는 클라이언트와 SQL 사이에 SET NOCOUNT ON을 테스트하는 방법을 모른다, 그래서 나는 "SET 트랜잭션 격리 수준 READ UNCOMMITTED"다른 SET 명령에 대한 비슷한 동작을 테스트

    나는 클라이언트와 SQL 사이에 SET NOCOUNT ON을 테스트하는 방법을 모른다, 그래서 나는 "SET 트랜잭션 격리 수준 READ UNCOMMITTED"다른 SET 명령에 대한 비슷한 동작을 테스트

    나는 SQL의 기본 동작을 (READ 커밋) 변경 내 연결에서 명령을 전송, 그것은 다음 명령에 대한 변경되었습니다. 내가 저장 프로 시저 내부의 격리 수준을 변경하는 경우, 다음 명령의 연결 동작을 변경하지 않았다.

    현재 결론

    나는이 같은 "SET NOCOUNT ON"과 같은 다른 SET 명령과 관련이 생각

  13. ==============================

    13.나는 그것의 아주 오래된 질문을 알고있다. 하지만 바로 업데이트.

    나는 그것의 아주 오래된 질문을 알고있다. 하지만 바로 업데이트.

    "SET NOCOUNT ON"을 사용하는 가장 좋은 방법은 먼저 SP에서 문 그냥 마지막 SELECT 문 앞에 다시 OFF 설정으로 넣어하는 것입니다.

  14. ==============================

    14.(OFF에는 카운트 == 설정되어 있지 있으면)

    (OFF에는 카운트 == 설정되어 있지 있으면)

    { 다음은 영향을 얼마나 많은 기록 데이터를 유지합니다 그래서 성능이 저하 } 그밖에 { 그것은 변화의 기록을 추적하지 않습니다 따라서 perfomace을 향상 } }

  15. ==============================

    15.때로는 간단한 일들이 차이를 만들 수 있습니다. 모든 저장 프로 시저의 일부가되어야 간단한 항목 중 하나는 SET NOCOUNT ON입니다. SQL 서버는 각각의 T-SQL 문 뒤에 다시 클라이언트로 전송하는 메시지 오프 저장 프로 시저 턴의 상단에 넣어이 코드 한 줄이 실행됩니다. 이 모든 SELECT, INSERT, UPDATE 및 DELETE 문에 대한 실행된다. 이 정보를 갖는 것은 쿼리 창에서 T-SQL 문을 실행할 때 편리하지만, 저장 프로 시저를 실행할 때이 정보를 클라이언트에게 전달 할 필요는 없다.

    때로는 간단한 일들이 차이를 만들 수 있습니다. 모든 저장 프로 시저의 일부가되어야 간단한 항목 중 하나는 SET NOCOUNT ON입니다. SQL 서버는 각각의 T-SQL 문 뒤에 다시 클라이언트로 전송하는 메시지 오프 저장 프로 시저 턴의 상단에 넣어이 코드 한 줄이 실행됩니다. 이 모든 SELECT, INSERT, UPDATE 및 DELETE 문에 대한 실행된다. 이 정보를 갖는 것은 쿼리 창에서 T-SQL 문을 실행할 때 편리하지만, 저장 프로 시저를 실행할 때이 정보를 클라이언트에게 전달 할 필요는 없다.

    네트워크에서이 추가 오버 헤드를 제거하여 크게 데이터베이스 및 응용 프로그램에 대한 전반적인 성능을 향상시킬 수 있습니다.

    당신은 아직도 여전히 @@ ROWCOUNT 옵션을 사용하여 실행중인 T-SQL 문에 의해 영향을받는 행의 수를 얻을 필요합니다. 이 기능에 SET NOCOUNT을 실행하여 (@@ ROWCOUNT) 여전히 작동하고 여전히 문에 의해 영향을받은 행 수를 확인하기 위해 저장 프로 시저에서 사용할 수 있습니다.

  16. from https://stackoverflow.com/questions/1483732/set-nocount-on-usage by cc-by-sa and MIT license