사용 횟수 설정 없음


341

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

SQL Server에 SET NOCOUNT ON을 사용해야합니까? 그렇지 않다면 왜 안됩니까?

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

DML 뒤에 "xx rows 영향을받는"메시지를 표시하지 않습니다. 이것은 결과 집합이며 전송되면 클라이언트가 처리해야합니다. 작지만 측정 가능합니다 (아래 답변 참조).

트리거 등의 경우 클라이언트는 영향을받는 여러 "xx 행"을 수신하므로 일부 ORM, MS Access, JPA 등에 대한 모든 방식의 오류가 발생합니다 (아래 편집 참조).

배경:

일반적으로 허용되는 모범 사례 (이 질문까지는 SET NOCOUNT ONSQL Server의 트리거 및 저장 프로 시저에 사용하는 것이 좋습니다 . 우리는 어디에서나 사용하며 빠른 Google은 많은 SQL Server MVP도 동의합니다.

MSDN은 이것이 .net SQLDataAdapter를 손상시킬 수 있다고 말합니다 .

이제 이것은 SQLDataAdapter가 "n 개의 영향을받는 행"메시지가 일치 할 것으로 예상하기 때문에 완전히 CRUD 처리로 제한됨을 의미합니다. 그래서 나는 사용할 수 없습니다 :

  • 중복을 피하기 위해 존재하는 경우 (행에 영향을주지 않는 메시지) 참고 :주의해서 사용하십시오
  • 존재하지 않는 곳에
  • 사소한 업데이트 필터링 (예 : 실제로 데이터가 변경되지 않음)
  • 이전에 테이블 액세스 (예 : 로깅)를 수행하십시오.
  • 복잡성 또는 비 규범화 숨기기
  • 기타

질문에서 marc_s (그의 SQL 물건을 알고있는 사람)는 그것을 사용하지 않는다고 말합니다. 이것은 내가 생각하는 것과 다릅니다 (그리고 나는 SQL에서도 다소 유능하다고 생각합니다).

내가 뭔가를 잃어 버렸을 수도 있습니다 (명백하게 지적하십시오). 여러분은 어떻게 생각하십니까?

참고 : 요즘에는 SQLDataAdapter를 사용하지 않기 때문에이 오류가 발생한 지 몇 년이 지났습니다.

의견 및 질문 후 편집 :

편집 : 더 많은 생각 ...

여러 클라이언트가 있습니다. 하나는 C # SQLDataAdaptor를 사용하고 다른 하나는 Java의 nHibernate를 사용할 수 있습니다. 이것들은로 다른 방법으로 영향을받을 수 있습니다 SET NOCOUNT ON.

저장된 proc를 메소드로 간주하면 일부 내부 처리가 자신의 목적에 따라 특정 방식으로 작동한다고 가정하는 것이 좋지 않습니다 (패턴 방지).

편집 2 : 자 NHibernate 질문을 깨는 트리거는 여기서 SET NOCOUNT ON설정할 수 없습니다

(아니요, 이것 의 복제본 아닙니다 )

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

편집 4 : 2011 년 5 월 13 일

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

편집 5 : 2011 년 6 월 14 일

JPA, 저장 프로 시저를 테이블 변수와 함께 중단 합니다. JPA 2.0은 SQL Server 테이블 변수를 지원합니까?

편집 6 : 2011 년 8 월 15 일

SSMS "행 편집"데이터 그리드에는 SET NOCOUNT ON : GROUP BY를 사용한 업데이트 트리거가 필요합니다.

편집 7:07 3 월 2013

@RemusRusanu의 자세한 내용 :
SET NOCOUNT ON은 실제로 성능 차이를 크게 만들어 줍니까?


@AlexKuznetsov : "Threadsafe"접근 방식은 무엇입니까? EXISTS에서 수행 된 읽기에 여전히 미결 거래가 포함됩니까?
AnthonyWJones

2
@ Jeeremy Seghi : 늦게 답변 죄송합니다. (#rows 영향을받는) 메시지는 SSMS 등에 의해 해석되는 클라이언트 도구입니다. 그러나이 정보와 함께 전송 된 패킷이 있습니다. 물론 @@ rowcount가 어떻게 작동하는지 알고 있지만 이것이 문제의 핵심은 아닙니다.
gbn

1
걱정 마. 개인적으로 나는 당신의 견해에 동의합니다; 나는 IF / WHERE EXISTS 구문의 결과와 SET NOCOUNT 사이에 직접적인 상관 관계가 없다고 언급했습니다. NOCOUNT에 관계없이 해당 구성에서 일관된 결과를 얻습니다. 다른 말이 있으면 내 길로 보내주십시오.
Jeremy S

1
@Jeremy Seghi : 맞습니다. SET NOCOUNT ON 은 여분의 데이터 패킷 클라이언트에 다시 표시하지 않습니다. @@ ROWCOUNT 등은 모두 영향을받지 않습니다. 아, 그리고 그것은 SQLDataAdapters를 깰 ... :-)
gbn

1
@Kieren Johnstone : 뒤늦은 말로 표현하기 어려운 질문입니다. 이것이 내 질문이 아니라면 마감 투표를하겠습니다 ...
gbn

답변:


246

이제 연구를 마쳤습니다. 거래는 다음과 같습니다.

TDS 프로토콜에서는 SET NOCOUNT ON저장 만 "SET NOCOUNT ON"텍스트 자체가 무려 14 바이트 인 반면 쿼리 당 9 바이트 합니다. 나는 그것을 123 row(s) affected별도의 네트워크 패킷으로 일반 텍스트로 서버에서 반환 했다고 생각 했지만 실제로는 그렇지 않습니다. 실제로 DONE_IN_PROC응답에 포함 된 작은 구조 입니다. 별도의 네트워크 패킷이 아니므로 왕복이 낭비되지 않습니다.

거의 항상 성능에 대해 걱정하지 않고 기본 계산 동작을 유지할 수 있다고 생각합니다. 그러나 사전 전용 커서와 같이 미리 행 수를 계산하면 성능에 영향을주는 경우가 있습니다. 이 경우 NOCOUNT가 필요할 수 있습니다. 그 외에는 "가능한 경우 NOCOUNT 사용"모토를 따를 필요가 없습니다.

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


과연. SET NOCOUNT ON을 영원히 사용했지만 marc_s는 다른 질문에서 SQLDataAdapter의 한계를 지적했습니다.
gbn

감사. 바이트 또는 크기는 나에게 문제가 아니지만 클라이언트가 처리해야합니다. 그래도 여전히 놀랍게도 그것은 SQLDataAdapter 의존성입니다.
gbn

2
답변 주셔서 감사합니다. 귀하의 조사로 인해 더 많은 정보를 얻었고 저의 업무에 동의합니다. 그러나 오버 헤드에 동의하지 않습니다. 다른 답변이 보여주는 것처럼 중요 할 수 있습니다. 건배, gbn
gbn

13
의 그것의하지 수는 성능 살인자 와이어를 통해 자사의 왕복 지연 바이트
racingsnail

1
TDS 메시지 스트림에서, 예는 테이블에 값만 삽입하는 경우입니다. DONINPROC(RPC) 또는 DONE(BATCH) 메시지는 rowcount영향을받는 행 으로 설정된 상태로 스트리밍되며 , done_countis가 true있더라도 플래그는 NO_COUNT입니다 ON. 쿼리가 SELECT 문 또는 select를 수행하는 RPC 호출을 보유하는 경우 클라이언트 lib 구현에 따라 계산을 비활성화해야 할 수 있습니다. 비활성화 된 경우 select 문에 대해 행이 계속 계산되지만 플래그 DONE_COUNT는로 설정됩니다 false. 클라이언트 라이브러리가 여러분 대신 토큰 (메시지) 스트림을 해석하기 때문에 항상 제안하는 것을 읽으십시오
Milan Jaric

87

NOCOUNT 주변의 실제 벤치 마크 수치를 찾는 데 많은 시간이 필요했기 때문에 간단한 요약 정보를 공유 할 것이라고 생각했습니다.

  • 스토어드 프로 시저가 커서를 사용하여 리턴 된 결과없이 매우 빠른 조작을 많이 수행하는 경우 NOCOUNT OFF를 설정하면 ON을 수행하는 것보다 약 10 배가 걸릴 수 있습니다. 1 최악의 시나리오입니다.
  • 저장 프로 시저가 결과를 반환하지 않고 단일 빠른 작업 만 수행하는 경우 NOCOUNT ON을 설정 하면 성능이 약 3 % 향상 될 수 있습니다 . 2 이는 일반적인 삽입 또는 업데이트 절차와 일치합니다. 왜 이것이 항상 빠를 수 없는지에 대한 토론은이 답변에 대한 의견을 참조하십시오.
  • 저장 프로 시저가 결과를 반환하면 (예 : 무언가 선택) 성능 차이가 결과 집합의 크기에 비례하여 감소합니다.

5
커서에 미치는 영향 +1, 이것은 나의 관찰과 일치합니다.
zvolkov

포인트 2가 정확하지 않습니다! 나는 그것이 말하는 블로그를 의미합니다. 아니었다! NO_COUNT가 ON 또는 OFF로 설정되어 있는지에 관계없이 DONE 및 DONEPROC 및 DONEINPROC는 동일한 크기로 전송됩니다. RowCount는 여전히 ULONGLONG (64 바이트)으로 존재하고 플래그 DONE_COUNT는 여전히 존재하지만 비트 값은 0입니다. SQL Server는 어쨌든 행 수를 계산하지만 DONE 토큰에서 값을 읽지 않으려는 경우에도 마찬가지입니다. @@ ROWCOUNT를 읽으면 반환 값 토큰 또는 다른 colmetadata + 행 토큰으로 토큰 스트림에 더 많은 바이트를 추가했습니다!
Milan Jaric

@MilanJaric : 전화 해 주셔서 감사합니다. 당신은 내가 잘못된 기사를 연결했다는 것을 깨닫게 도와주었습니다. 이제 링크가 업데이트되었으며이 기사에서는 SET NOCOUNT ON을 사용하면 약간의 성능 향상이있을 수 있음을 보여주는 강력한 주장을합니다. 사용 된 벤치 마크 방법에 문제가 있다고 생각하십니까?
StriplingWarrior

:) SET NOCOUNT OFF / ON에 대해 여전히 부정확합니다. 오류는 두 번째 SP에 없기 때문에 SET NOCOUNT OFF;응답에서 추가 바이트를 얻지 못한다고 생각하는 이유입니다. 정확한 벤치 마크는 SET NOCOUNT ON왼쪽 및 SET NOCOUNT OFF오른쪽 저장 프로 시저에서 사용하는 것 입니다. 당신이 TDS 패키지를 얻을 것이다이 방법 DONEINPROC (SET NOCOUNT ...)을 다시 열, DONEINPROC (INSERT statement)다음과 RETURNVALUE(@@ROWCOUNT)다음, RETURNSTATUS 0SP과 마침내 DONPROC. 두 번째 sp의 본문에 SET NOCOUNT OFF가 없기 때문에 오류가 있습니다!
Milan Jaric

그들이 찾은 것을 다시 말하지만 그들이 깨닫지 못했던 것은 1K 페치 커서 요청이있는 경우 먼저 연결에 대해 NOCOUNT를 ON 또는 OFF로 설정 한 다음 동일한 연결을 사용하여 커서 페치를 1K 번 호출하여 대역폭을 절약한다는 요청입니다. NOCOUNT ON 또는 OFF의 실제 연결 상태는 대역폭에 영향을 미치지 않으며 클라이언트 라이브러리 (예 : ADO.net 또는 ODBC)와 혼동 될 수 있습니다. :) 그래서 "당신이 대역폭에 대해 걱정하는 경우 SET NOCOUNT <뭐든>를 사용하지 않는"
밀라노 Jaric

77
  • SET NOCOUNT가 ON이면 Transact-SQL 문의 영향을받는 행 수를 나타내는 개수가 반환되지 않습니다. SET NOCOUNT가 OFF이면 카운트가 반환됩니다. SELECT, INSERT, UPDATE, DELETE 문과 함께 사용됩니다.

  • SET NOCOUNT의 설정은 구문 분석 시간이 아니라 실행 또는 런타임에 설정됩니다.

  • SET NOCOUNT ON은 저장 프로 시저 (SP) 성능을 향상시킵니다.

  • 구문 : SET NOCOUNT {ON | 끄기}

SET NOCOUNT ON의 예 :

여기에 이미지 설명을 입력하십시오

SET NOCOUNT OFF의 예 :

여기에 이미지 설명을 입력하십시오


7
스크린 샷으로 쉽고 빠르게 이해할 수 있습니다. 잘 했어. :)
shaijut

35

어느 정도 DBA 대 개발자 문제라고 생각합니다.

개발자로서, 나는 당신이 절대적으로 긍정적으로해야하지 않는 한 그것을 사용하지 말라고 말하고 있습니다.

그리고 나는 DBA로서, 당신은 다른 편에 더 많을 것이라고 생각합니다. 실제로 사용을 막지 않으면 가능한 한 항상 사용하십시오.

또한 개발자가 ADO.NET의 ExecuteNonQuery메서드 호출에 의해 반환 된 "RecordsAffected"를 사용하는 SET NOCOUNT ON경우이 경우 이후에 모든 사람이 사용하면 문제가 발생합니다 . ExecuteNonQuery는 항상 0을 반환합니다.

또한 Peter Bromberg의 블로그 게시물 을보고 그의 위치를 ​​확인하십시오.

그래서 그것은 누가 표준을 설정하게 될지에 달려 있습니다 :-)

마크


그는 간단한 CRUD를 사용하고 있습니다. 그가 언급 한 데이터 그리드는 xml을 사용하여 왕복 등을 피하기 위해 여러 행을 보낼 수 있습니다
gbn

SqlDataAdapters를 사용하지 않고 ExecuteNonQuery가 반환 한 "영향을받는 레코드"번호를 확인하고 의존하지 않는 경우가 있습니다 (예 : Linq-to-SQL 또는 NHibernate와 같은 것을 사용하는 경우). 아마도 문제가 없을 것입니다. 저장된 모든 procs에서 SET NOCOUNT ON을 사용합니다.
marc_s

12

다른 클라이언트도있을 수 있다고 말하는 경우 SET NOCOUNT가 ON으로 설정되어 있지 않으면 클래식 ADO에 문제가 있습니다.

내가 정기적으로 경험하는 것 : 저장 프로 시저가 많은 문을 실행하여 여러 "xxx rows 영향을받는"메시지가 반환되는 경우 ADO는이를 처리 하지 않고 "Recordset 개체의 ActiveConnection 속성을 변경할 수 없습니다" 오류를 발생시킵니다 소스로 Command 객체가 있습니다. "

따라서 실제로는 그렇지 않은 이유가없는 한 일반적으로 ON 설정을 권장합니다 . 내가 가서 더 읽어야 할 정말 좋은 이유를 발견했을 수도 있습니다.


9

일을 더 복잡하게 만들 위험이 있으므로 위에서 본 모든 사람들에게 약간 다른 규칙을 권장합니다.

  • 항상 설정 NOCOUNT ON하면 PROC에서 어떤 일을하기 전에, 발동의 상단에,하지만 또한 항상 SET NOCOUNT OFF저장된 proc 디렉토리에서 모든 레코드를 반환하기 전에, 다시.

따라서 "실제로 결과 집합을 반환 할 때를 제외하고는 일반적으로 고려하지 않습니다." 이것이 클라이언트 코드를 손상시킬 수있는 방법을 모르겠습니다. 클라이언트 코드가 proc 내부에 대해 아무것도 알 필요가 없으며 특히 번거롭지 않습니다.


감사. 물론 DataSet 또는 소비 컨테이너에서 행 수를 얻을 수 있지만 유용 할 수 있습니다. SELECT에 대한 트리거를 가질 수 없으므로 안전합니다. 대부분의 클라이언트 오류는 데이터 변경에 대한 잘못된 메시지로 인해 발생합니다.
gbn

이 규칙의 문제점은 "프로세스 상단에 SET NOCOUNT ON?"보다 테스트하기가 어렵다는 것입니다. Sql Enlight와 같은 SQL 분석 도구가 이런 종류의 일을 테스트 할 수 있는지 궁금합니다. SQL 포매터 프로젝트를위한 장기적인 할 일 목록에 추가하기 :)
Tao

5

NHibernate를 깨뜨리는 방아쇠에 관해, 나는 그 경험을 직접 경험했습니다. 기본적으로 NH가 UPDATE를 수행하면 특정 수의 행이 영향을받습니다. 트리거에 SET NOCOUNT ON을 추가하면 행 수를 NH가 예상 한 값으로 되돌려 문제를 해결할 수 있습니다. 따라서 NH를 사용하는 경우 트리거를 위해 끄는 것이 좋습니다.

SP의 사용법과 관련하여 개인 취향의 문제입니다. 나는 항상 행 수를 끈 적이 있었지만 다시 한 번 더 강력한 논거는 없습니다.

다른 말로, SP 기반 아키텍처에서 벗어나는 것을 고려해야합니다. 그렇지 않으면이 질문조차 없습니다.


1
저장된 procs에서 멀어 지는데 동의하지 않습니다. 이것은 2 개의 서로 다른 클라이언트 코드 기반에서 동일한 SQL을 가져야하고 클라이언트 코더를 신뢰해야 함을 의미합니다. 우리는 개발자 DBA입니다. "SET NOCOUNT ON " 을 의미하지 않습니까?
gbn

@CodeBlend : Google에서 필요 이상으로 사용하십시오. 그러나 ... stackoverflow.com/a/4040466/27535
gbn

3

'SET NOCOUNT ON'이 네트워크 패킷이나 왕복을 저장하지 않는다는 것을 스스로 확인하고 싶었습니다.

다른 호스트에서 테스트 SQLServer 2017을 사용했습니다 (VM을 사용함) 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 . 도구 'Wireshark': 'capture filter'버튼-> 'port 1433'을 사용하여 포트 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'을 볼 수 있는데 '07'은 '영향을받는 행 수'입니다. 응답 패킷에 포함되어 있습니다. 추가 패킷이 없습니다.

그러나 13 바이트가 추가로 저장 될 수 있지만 열 이름을 줄이는 것 (예 : 'ManagingDepartment'에서 'MD'로)보다 가치가 없습니다.

따라서 성능을 위해 사용할 이유가 없습니다.

그러나 다른 사람들이 언급했듯이 ADO.NET을 손상시킬 수 있으며 파이썬을 사용하여 문제를 발견했습니다 .MSSQL2008-Pyodbc-이전 SQL은 쿼리가 아닙니다.

아마 좋은 습관 일 것입니다 ...


1
SET NOCOUNT ON;

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


2
@@ ROWCOUNT는 여전히 설정되어 있습니다. SET NOCOUNT ON은 SQL Server가 클라이언트에 보내는 추가 응답을 억제합니다. 위의 답변을 참조하십시오
gbn

1

NOCOUNT ON 설정; 위의 코드는 DML / DDL 명령 실행 후 SQL Server 엔진에서 생성 된 메시지를 결과 창으로 향하게합니다.

왜 우리는? SQL Server 엔진은 상태를 가져오고 메시지를 생성하는 데 약간의 리소스를 사용하므로 SQL Server 엔진에 대한 오버로드로 간주되므로 카운트가 아닌 메시지를 설정합니다.


1

한 곳에서 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 NoCountOnEXEC NoCountOffNoCountOff 하나에 추가 3백90킬로바이트 트래픽이 있었다는 것을 보여준다 :

고객 통계

아마도 루프 또는 커서에서 쿼리를 수행하는 것은 이상적이지 않지만 이상적인 세계에는 살지 않습니다. :)


0

나는 그것이 아주 오래된 질문이라는 것을 안다. 그러나 단지 업데이트를 위해.

"SET NOCOUNT ON"을 사용하는 가장 좋은 방법은 SP를 첫 번째 명령문으로 설정하고 마지막 SELECT 문 직전에 다시 OFF로 설정하는 것입니다.


0

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

결과

영향을받는 행

1

메시지

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

완료 시간 : 2020-06-18T16 : 20 : 16.9686874 + 02 : 00


-1

클라이언트와 SQL간에 SET NOCOUNT ON을 테스트하는 방법을 모르므로 다른 SET 명령 "SET TRANSACTION ISOLATION LEVEL READ UNCIMMITTED"에 대해 유사한 동작을 테스트했습니다.

연결에서 SQL의 기본 동작 (READ COMMITTED)을 변경하는 명령을 보냈으며 다음 명령에 대해 변경되었습니다. 저장 프로 시저 내에서 ISOLATION 수준을 변경해도 다음 명령의 연결 동작은 변경되지 않았습니다.

현재 결론

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

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


위의 포인트 1은 지구 환경에 영향을 미치지 않기 때문에 마지막에 실제로 NOCOUNT OFF를 설정할 필요가 없음을 의미합니까?
funkymushroom

이것이 그가 포인트 1의 의미인지 확실하지 않지만 테스트에서 그렇습니다. 전역 환경은 저장 프로 시저 내에서 SET NOCOUNT ON의 영향을받지 않습니다.
Doug

분리 레벨이 명시 적으로 특정 거래와 관련이 있기 때문에, 비교의 빈약 한 선택이었다, 그래서 같은 설정과 일치하도록 기대하는 특별한 이유가 없다NOCOUNT
IMSoP

-1

if (count no count == off로 설정)

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


-1

때로는 가장 간단한 것조차도 차이를 만들 수 있습니다. 모든 저장 프로 시저에 포함되어야하는 이러한 간단한 항목 중 하나는 SET NOCOUNT ON입니다. 저장 프로 시저의 맨 위에있는이 한 줄의 코드는 각 T-SQL 문이 실행 된 후 SQL Server가 클라이언트로 다시 보내는 메시지를 끕니다. 이것은 모든 수행 SELECT, INSERT, UPDATE, 및DELETE 문. 이 정보는 조회 창에서 T-SQL 문을 실행할 때 유용하지만 스토어드 프로 시저가 실행될 때이 정보를 클라이언트로 다시 전달할 필요는 없습니다.

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

여전히 실행중인 T-SQL 문의 영향을받는 행 수를 가져와야하는 경우에도 @@ROWCOUNT옵션을 사용할 수 있습니다. SET NOCOUNT ON이 함수 ( @@ROWCOUNT) 를 발행하면 여전히 작동하며 명령문에 의해 영향을받는 행 수를 식별하기 위해 스토어드 프로 시저에서 계속 사용될 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.