source

사용 시 NOCOUNT ON 설정

ittop 2023. 4. 7. 21:55
반응형

사용 시 NOCOUNT ON 설정

SET NOCOUNT에 대한 다른 견해가 있는 이 질문에서 영감을 얻어...

SQL Server에 SET NOCOUNT ON을 사용해야 합니까?만약 아니라면, 왜?

2011년 7월 22일 편집 6의 기능

DML 뒤에 "xx lows affected" 메시지가 표시되지 않도록 합니다.이것은 결과 세트이며, 송신시에 클라이언트는 그것을 처리할 필요가 있습니다.작지만 측정할 수 있습니다(아래 답변 참조).

트리거 등의 경우 클라이언트는 여러 개의 "해당 xx 행"을 수신합니다.이로 인해 일부 ORM, MS Access, JPA 등에 대해 모든 종류의 오류가 발생합니다(아래 편집 참조).

배경:

베스트 프랙티스(하고 있었습니다)는, 「이 질문까지」를 사용하는 입니다.SET NOCOUNT ONSQL Server에 대해 설명하겠습니다.델은 어디에서나 사용하고 있으며, 퀵 구글에서는 많은 SQL Server MVP들도 이에 동의하고 있습니다.

MSDN에 따르면 .net SQLDataAdapter가 파손될 수 있습니다.

즉, SQLDataAdapter는 단순히 CRUD 처리에만 한정되어 있습니다.이는 SQLDataAdapter가 "해당되는 n개의 행" 메시지가 일치할 것으로 예상하기 때문입니다.사용할 수 없습니다.

  • 중복을 방지하기 위해 존재하는 경우(해당 메시지 행 없음) 주의: 주의하여 사용하십시오.
  • 존재하지 않는 위치(예상된 행보다 적은 행)
  • 사소한 업데이트(예: 실제로 데이터가 변경되지 않음)를 필터링합니다.
  • 전에 테이블액세스 실행(로그 등)
  • 복잡성 또는 디노멀리시스
  • 기타

질문에서 marc_s(SQL 정보를 알고 있는 사람)는 사용하지 말라고 합니다.이것은 제 생각과는 다릅니다(또한 SQL에서도 어느 정도 유능하다고 생각합니다).

제가 뭔가 놓치고 있을 가능성이 있습니다(명백한 점을 자유롭게 지적해 주세요). 하지만 여러분들은 어떻게 생각하십니까?

주의: SQLData Adapter를 사용하지 않기 때문에 이 오류가 발생한 지 몇 년이 지났습니다.

코멘트 및 질문 후 편집:

편집: 더 많은 생각...

여러 클라이언트가 있습니다.C# SQLData 어댑터입니다.java nHibernate 를에에 。은 여러 로 영향을 수 .SET NOCOUNT ON.

저장된 proc를 메서드로 간주하는 경우 일부 내부 처리가 자신의 목적에 맞게 특정 방식으로 작동한다고 가정하는 것은 잘못된 형식(안티 패턴)입니다.

편집 2: 트리거 브레이크 nHibernate 질문, 여기서SET NOCOUNT ON할 수 없다

(이것의 복제품이 아닙니다)

편집 3: MVP 동료 덕분에 더 많은 정보를 얻을 수 있습니다.

편집 4: 2011년 5월 13일

지정되지 않은 경우 Linq 2 SQL도 중단합니까?

편집 5: 2011년 6월 14일

테이블 변수가 있는 스토어드 proc의 JPA를 끊습니다.JPA 2.0은 SQL Server 테이블 변수를 지원합니까?

편집 6: 2011년 8월 15일

SSMS "행 편집" 데이터 그리드에 SET NOCOUNT ON: GROUP BY로 트리거 업데이트 필요

편집 7: 2013년 3월 7일

@RemusRusanu:
큰 낼 수 ?SET NOCOUNT ON으로 하겠습니다

자, 이제 조사를 마쳤으니 이렇게 합시다.

에서 TDS는 'TDS"입니다.SET NOCOUNT ON"SET NOCOUNT ON" 텍스트 자체가 무려 14바이트인 반면 쿼리당 9바이트만 저장합니다.라고 생각하곤 했다.123 row(s) affected서버에서 일반 텍스트로 별도의 네트워크 패킷으로 반환되었지만 그렇지 않습니다. 작은 DONE_IN_PROC응답에 포함되어 있습니다.별도의 네트워크 패킷이 아니기 때문에 라운드 트립은 낭비되지 않습니다.

성능 걱정 없이 거의 항상 기본 카운트 동작을 유지할 수 있다고 생각합니다.다만, 행의 수를 미리 계산하면, 순방향 전용 커서와 같이 퍼포먼스에 영향을 주는 경우가 있습니다.이 경우 NOCOUNT가 필요할 수 있습니다.그 외에는 '가능한 한 NOCOUNT를 사용한다'는 모토를 따를 필요가 전혀 없다.

입니다.SET NOCOUNT설정 : https://web.archive.org/web/20210128112523/http : //daleburnett.com/2014/01/everything-ever-wanted-know-set-nocount/

NOCOUNT에 관한 실제 벤치마크 수치를 찾는 데 많은 시간이 걸렸기 때문에 간단한 요약을 공유하기로 했습니다.

  • 저장 프로시저가 커서를 사용하여 많은 매우 빠른 작업을 수행했지만 결과가 반환되지 않은 경우, NOCOUNT OFF를 설정하는 데 걸리는 시간은 ON인 시간의 약 10배입니다.1 이것은 최악의 시나리오입니다.
  • 스토어드 프로시저가 반환된 결과 없이 단일 빠른 작업만 수행하는 경우 NOCOUNT를 ON으로 설정하면 약 3%의 성능이 향상될 수 있습니다.2 이는 일반적인 삽입 또는 업데이트 절차와 일치합니다(이 방법이 항상 빠르지 않은 이유에 대한 자세한 내용은 이 답변의 주석을 참조하십시오).
  • 저장 프로시저가 결과를 반환하는 경우(즉, SELECT something something), 결과 세트의 크기에 비례하여 성능 차이가 감소합니다.
  • SET NOCOUNT가 ON이면 카운트(Transact-SQL 문의 영향을 받는 행 수를 나타냄)가 반환되지 않습니다.SET NOCOUNT가 OFF이면 카운트가 반환됩니다.SELECT, INSERT, UPDATE, DELETE 문과 함께 사용됩니다.

  • SET NOCOUNT 설정은 해석 시간이 아닌 실행 시간 또는 실행 시간에 설정됩니다.

  • SET NOCOUNT ON은 SP(Stored Procedure) 성능을 향상시킵니다.

  • 구문: SET NOCOUNT { ON | OFF }

SET NOCOUNT ON의 예:

여기에 이미지 설명 입력

SET NOCOUNT OFF의 예:

여기에 이미지 설명 입력

어느 정도 DBA 대 개발자 문제인 것 같습니다.

개발적으로는, 반드시 필요한 경우가 아니면 사용하지 말아 주세요. 왜냐하면 ADO가 망가질 수 있기 때문입니다.NET 코드(Microsoft 문서 참조).

DBA라면 다른 쪽에 더 많이 있을 것입니다.사용을 막을 필요가 없는 한 가능한 한 언제든지 사용할 수 있습니다.

「ADO」 「Records Affected」(해당 레코드)입니다.네 netExecuteNonQuery 모든 이 다 '어쩌다', '어쩌다', '어쩌다'를 합니다.SET NOCOUNT ON0을 합니다.

또한 Peter Bromberg의 블로그 투고를 보고 그의 입장을 확인해 보세요.

따라서 결국 누가 표준을 설정할 것인가에 따라 결정됩니다.-)

마크

클라이언트도 다를 수 있다고 하는 경우는, SET NOCOUNT 가 ON 으로 설정되어 있지 않은 경우는, 종래의 ADO 에 문제가 있습니다.

그 중 하나는 스토어드 프로시저가 다수의 문을 실행하는 경우(그 결과 다수의 "해당 xxx 행" 메시지가 반환되는 경우), ADO는 이를 처리하지 않고 "Cannot change the ActiveConnection property of a Recordset object of a Command object of the source" (명령어 오브젝트를 소스로 하는 레코드 세트 객체의 ActiveConnection 속성을 변경할 수 없습니다)라는 오류를 발생시킵니다.

그래서 저는 보통 정말 좋은 이유가 없는 한 그것을 켜는 것을 지지합니다.제가 더 읽어봐야 할 정말 좋은 이유를 찾으셨겠죠

상황을 더 복잡하게 만들 수 있는 위험을 무릅쓰고 위에 보이는 모든 규칙에는 약간 다른 규칙을 권장합니다.

  • 「」를 설정해 주세요.NOCOUNT ON프로시저의 상부에서, 프로시저의 작업을 실시하기 전에, 그러나 항상SET NOCOUNT OFF저장된 proc에서 레코드 세트를 반환하기 전에 다시 한 번 확인합니다.

따라서 "실제로 결과 세트를 반환하는 경우를 제외하고 일반적으로 no count on"으로 유지합니다.이것이 클라이언트 코드를 해독할 수 있는 어떤 방법도 모릅니다.이것은 클라이언트 코드가 프로시저의 내부 정보를 전혀 알 필요가 없다는 것을 의미합니다.또, 특별히 부담이 되는 것도 아닙니다.

NHibernate를 깨는 트리거에 대해서는 직접 경험했습니다.기본적으로 NH는 업데이트를 수행할 때 영향을 받는 행의 수를 예상합니다.트리거에 SET NOCOUNT ON을 추가하면 NH가 예상한 대로 행 수를 되돌려 문제를 해결할 수 있습니다.따라서 NH를 사용하는 경우 트리거를 위해 반드시 꺼야 합니다.

SP에서의 사용에 대해서는 개인 취향입니다.저는 항상 행 수를 껐지만, 다시 말씀드리지만, 어느 쪽이든 정말 강력한 논쟁은 없습니다.

이와는 달리 SP 기반 아키텍처에서 벗어나야 합니다. 그러면 이 질문조차 받지 않게 됩니다.

'SET NOCOUNT ON'으로 네트워크 패킷이나 왕복이 저장되지 않음을 확인하고 싶었다.

호스트에서 SQL ). create table ttable1 (n int); insert into ttable1 values (1),(2),(3),(4),(5),(6),(7) go create procedure procNoCount as begin set nocount on update ttable1 set n=10-n end create procedure procNormal as begin update ttable1 set n=10-n end 으로 ' : filter'> ' > 'Wireshark' : 'capture filter' : 'capture filter' -> 'port 1433' 도구를 하여 포트 했습니다.

exec procNoCount

은 응답 패킷입니다.「 」 、 「 」 。 0000 00 50 56 c0 00 08 00 0c 29 31 3f 75 08 00 45 00 0010 00 42 d0 ce 40 00 40 06 84 0d c0 a8 32 88 c0 a8 0020 32 01 05 99 fe a5 91 49 e5 9c be fb 85 01 50 18 0030 02 b4 e6 0e 00 00 04 01 00 1a 00 35 01 00 79 00 0040 00 00 00 fe 00 00 e0 00 00 00 00 00 00 00 00 00

exec procNormal

은 응답 패킷입니다.「 」 、 「 」 。 0000 00 50 56 c0 00 08 00 0c 29 31 3f 75 08 00 45 00 0010 00 4f d0 ea 40 00 40 06 83 e4 c0 a8 32 88 c0 a8 0020 32 01 05 99 fe a5 91 49 e8 b1 be fb 8a 35 50 18 0030 03 02 e6 1b 00 00 04 01 00 27 00 35 01 00 ff 11 0040 00 c5 00 07 00 00 00 00 00 00 00 79 00 00 00 00 0050 fe 00 00 e0 00 00 00 00 00 00 00 00 00

40번 줄에 '07'이 보이는데, 이는 '해당 행'의 숫자입니다.응답 패킷에 포함됩니다.추가 패킷은 없습니다.

그러나 13바이트를 더 절약할 수 있지만 열 이름을 줄이는 것보다 더 가치가 있는 것은 아닐 수 있습니다(예: "Managing Department"에서 "MD"로).

퍼포먼스에 사용할 이유가 없습니다.

하지만 다른 사람들이 언급했듯이 그것은 ADO를 깨뜨릴 수 있다.NET과 저는 python: MSQL2008 - Pyodbc - 이전 SQL은 쿼리가 아닙니다.

그래서 아마 좋은 습관일 거야...

★★★의 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 .EXEC NoCountOn ★★★★★★★★★★★★★★★★★」EXEC NoCountOff, 의 1 에 의 추가 것을 .NoCountOff 에 390KB 。

클라이언트 통계 정보

루프나 커서로 쿼리를 실행하는 것은 이상적이지 않을 수 있지만, 이상적인 세계에 살고 있는 것도 아닙니다.

SET NOCOUNT ON;

이 코드 행은 쿼리 실행 시 영향을 받는 행 수를 반환하지 않기 위해 SQL에서 사용됩니다.영향을 받는 행의 수가 필요하지 않은 경우 메모리 사용량을 줄이고 쿼리 실행 속도를 높이는 데 도움이 되므로 이를 사용할 수 있습니다.

SET NOCOUNT ON: 위 코드는 DML/DDL 명령 실행 후 SQL Server 엔진에서 생성된 메시지를 전면 결과 창에 중지합니다.

왜 하는 거야?SQL Server 엔진은 상태를 가져오고 메시지를 생성하기 위해 리소스가 필요하므로 SQL Server 엔진에 대한 오버로드로 간주됩니다.그래서 non count 메시지를 설정했습니다.

  • SET NOCOUNT ON - "명령어가 성공적으로 완료되었습니다"라고 표시됩니다.
  • SET NOCOUNT OFF - (해당 행의)가 표시됩니다.

꽤 오래된 질문인건 알지만, 그냥 업데이트하려고요.

"SET NOCOUNT ON"을 사용하는 가장 좋은 방법은 SP의 첫 번째 스테이트먼트로 올린 후 마지막 SELECT 스테이트먼트 직전에 다시 OFF로 설정하는 것입니다.

SET NOCOUNT ON을 사용하면 다음과 같은 영향을 받는 행에 액세스할 수 있습니다.

SET NOCOUNT ON

DECLARE @test TABLE (ID int)

INSERT INTO @test
VALUES (1),(2),(3)

DECLARE @affectedRows int = -99  

DELETE top (1)
  FROM @test
SET @affectedRows = @@rowcount

SELECT @affectedRows as affectedRows

결과.

Affected Rows

1

메시지

명령이 성공적으로 완료되었습니다.

완료시간 : 2020-06-18T 16:20:16.968674+02:00

클라이언트와 SQL 사이에서 SET NOCOUNT를 테스트하는 방법을 모르기 때문에 다른 SET 명령 "SET TRANSACTION ILECTION LEVEL READ Unimitted"에 대해서도 비슷한 동작을 테스트했습니다.

연결에서 SQL(READ COMMITED) 기본 동작을 변경하는 명령을 전송했는데 다음 명령에서 변경된 것입니다.저장 프로시저 내에서 INSION 수준을 변경해도 다음 명령의 연결 동작은 변경되지 않았습니다.

현재의 결론,

  1. 저장 프로시저 내에서 설정을 변경해도 연결 기본 설정은 변경되지 않습니다.
  2. ADOCnection을 사용하여 명령을 전송하여 설정을 변경하면 기본 동작이 변경됩니다.

이것은 'SET NOCOUNT ON'과 같은 다른 SET 명령어와 관련이 있다고 생각합니다.

if(no count== off로 설정)

{이후 영향을 받는 레코드 수 데이터가 유지되므로 성능이 저하됩니다.} 그렇지 않으면 {변경 레코드를 추적하지 않으므로 성능이 향상됩니다.}

때로는 가장 간단한 것들도 차이를 만들 수 있다.모든 저장 프로시저에 포함되어야 하는 이러한 간단한 항목 중 하나는 다음과 같습니다.SET NOCOUNT ON저장 프로시저의 맨 위에 있는 이 코드 한 줄에 의해 T-SQL 문이 실행될 때마다 SQL Server가 클라이언트에 보내는 메시지가 꺼집니다.이 작업은 모든 사용자를 위해 수행됩니다.SELECT,INSERT,UPDATE , , , , 입니다.DELETE할 때 클라이언트에.이 정보는 쿼리 창에서 T-SQL 문을 실행할 때 편리하지만 스토어드 프로시저를 실행할 때는 이 정보를 클라이언트에 반환할 필요가 없습니다.

이 여분의 오버헤드를 네트워크에서 제거함으로써 데이터베이스와 애플리케이션의 전체적인 성능을 크게 향상시킬 수 있습니다.

을 받는 가 있는 는, 「T-SQL」을 할 수 .@@ROWCOUNT★★★★★★★★★★★★★★★★★★★★★★★★★★★★.SET NOCOUNT ON 함수이 함수)@@ROWCOUNT 행 할 수 있습니다는 여전히 동작하며 저장 프로시저에서 사용하여 문의 영향을 받은 행 수를 식별할 수 있습니다.

언급URL : https://stackoverflow.com/questions/1483732/set-nocount-on-usage

반응형