명령문 실행 속도가 네트워크 연결에 의존하는 이유는 무엇입니까?


31

T-SQL 실행 속도는 서버에 대한 네트워크 연결 대기 시간에 달려 있습니다. SQL Server에 대해 클라이언트에 다시보고 할 내용이 없으면 완료 될 때까지 실행되지만 테스트는 다른 이야기를 보여줍니다.

create procedure UselessLoop
  @I int
as
declare @D datetime = getdate()
while @I > 0 set @I -= 1
print datediff(millisecond, @D, getdate())

exec UselessLoop 100000

Server    Milliseconds
local     53
nearby    63
faraway   660

exec UselessLoop 1000000

Server    Milliseconds
local     546
nearby    640
faraway   6183

테스트는 SSMS를 사용하는 다른 컴퓨터의 동일한 서버에 대해 실행됩니다. 로컬은 서버에서 실행되고, 근처는 동일한 로컬 네트워크에 있으며, 500km 떨어진 1 기가비트 파이버로 연결된 다른 사무실에서 실행됩니다.

실행 된 명령문 수에 직접적으로 의존하는 SQL Server와 클라이언트간에 진행중인 통신이 분명히 있습니다.

나는 Wireshark를 사용하여 전송되는 것을 보았지만 그 점을 많이 이해할 수는 없지만 22740 패킷으로 총 26MB를 교환하는 tcp.stream이었습니다.

대신 쓸모없는 기능은 어떻습니까?

create function dbo.UDFUselessLoop(@I int)
returns int
as
begin
  declare @D datetime = getdate()
  while @I > 0 set @I -= 1
  return datediff(millisecond, @D, getdate())
end

print dbo.UDFUselessLoop(1000000)

실행 위치에 관계없이 406 밀리 초로 실행됩니다. 루프에서 클라이언트와 통신이없는 것 같습니다.


3
내 질문 에이 답변을 참조하십시오. stackoverflow.com/a/1547539
gbn

답변:


33

실행 된 명령문 수에 직접적으로 의존하는 SQL Server와 클라이언트간에 진행중인 통신이 분명히 있습니다.

그렇습니다. 기본적으로 SQL Server는 전송 TDS의 DONE_IN_PROC메시지를모든 문 저장 프로 시저입니다. 메시지는 완료된 명령문에 대한 상태 및 행 수 정보를 클라이언트에 전달합니다.

T-SQL 명령을 사용하여 이러한 메시지의 전송을 억제 할 수 있습니다.

SET NOCOUNT ON;

다음은 이 명령에 대한 온라인 설명서 항목 에서 발췌 한 내용입니다 .

실제 데이터를 많이 반환하지 않는 여러 명령문이 포함 된 저장 프로시 저나 Transact-SQL 루프가 포함 된 프로 시저의 경우 SET NOCOUNT를 ON으로 설정하면 네트워크 트래픽이 크게 줄어들 기 때문에 성능이 크게 향상 될 수 있습니다.

관련 Q & A : 간단한 루프로 ASYNC_NETWORK_IO가 대기하는 이유는 무엇입니까?

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