2014-04-28 3 views
2

C# 응용 프로그램이 SQL Server에 간단한 SQL 스크립트를 보내고 서버에서 응답을 보여줍니다.Sql 서버 응답 시간이 일치하지 않습니다.

코드는 다음과 같다 :

static SqlConnection conn = new SqlConnection("Data Source=servername;Initial Catalog=dbname;User ID=username;Password=password"); 

static void Main(string[] args) 
{ 
    conn.Open(); 
    while (Console.ReadLine() == "") 
    { 
     ShowData(); 
    } 
    conn.Close(); 
} 

static Stopwatch sw = Stopwatch.StartNew(); 

static void ShowData() 
{ 
    var t1 = sw.ElapsedMilliseconds; 
    var s = @"SELECT TOP (1) [t0].[GroupName] FROM [dbo].[Groups] AS [t0] WITH (NOLOCK) WHERE [t0].[GroupId] = '43ed86d4-42ef-4e6c-9a98-ba48c1f293e7'"; 

    var com = new SqlCommand(s, conn); 
    var reader = com.ExecuteReader(); 

    if (reader.Read()) 
    { 
     Console.WriteLine(reader[0]); 
    } 

    reader.Close(); 

    Console.WriteLine(sw.ElapsedMilliseconds - t1); 
} 

응용 프로그램의 스크린 샷 :
console application screenshot

와이어 샤크 스크린 샷 :
wireshark screenshot

내가 여러 번 Enter 키를 누르면, 응답 시간이 일치하지 않습니다. 내가 누르는 지난 6 번에서 가장 빠른 응답은 5ms이고 가장 느린 응답은 29ms입니다. 이유는 모르겠지만 모든 응답이 서버에 캐시되어야합니다.

나는 이미 SQL Server를 프로파일 링했으며 이러한 SQL 기간은 모두 0입니다. 실행 계획은 모두 Clustered Index Seek입니다.

+0

네트워크에 문제가 있습니까? SQL Server가 실행되는 서버에서 프로그램을 실행하면 재현성이 있습니까? – usr

+0

@usr 예, 그렇습니다. 나는 또한 서버 측에서 wireshark를 실행했다. – chengbo

+0

차단 또는 스파이크로드와 같은 일반적인 SQL Server 문제를 제외 시키려고 했습니까? – usr

답변

2

나는이 차이를 몇 가지 다른 방법으로 파고 들며 분산을 더 잘 이해할 것을 제안합니다. 당신이 (더 검색이 필요하지 않은 경우) SELECT 1처럼 뭔가 쿼리를 변경하면 어떻게되는지 예를 들어

, ...

... 당신은 여전히이와 분산을보고하는 경우, 그럼 내가 좋겠 다른 사람들이 말하고있는 것 ... 네트워크, 다른 프로세스에서 예기치 않은로드 등을 의심합니다. BTW, 데이터베이스 서버에 기가비트 네트워크 연결이있어 아무런 성능 저하도 없습니다.

... 이렇게하면 차이가 없어지면 SQL Server의 검색에 대한 의심이 필요합니다. 예 : 서로 다른 두 가지 쿼리 계획 사이에 격렬한 관계가 있습니까? 당신은 클러스터 된 인덱스 Seek을 사용하고있다라고 말하고 있습니까 ... 고유하지 않은 GroupId 열에 클러스터 된 인덱스가 있다고 말하는 것입니까?

+1

"선택 1 ..."좋은 제안! 실험을 통해 디버깅하는 사람을 찾는 것은 드뭅니다. 대부분의 사람들은 문제를 응시하고 해결책을 생각하려고합니다. – usr

1

인식 된 응답 시간은 네트워크 연결 정체, SQL Server의 CPU 사용량, 응용 프로그램이 실행되는 컴퓨터의 CPU 사용량, HDD I/O 등 여러 요소에 따라 다릅니다. 캐싱을하더라도 정확히 동일합니다.

+0

또한 서버 측에서 wireshark를 실행하면이 문제가 발생하므로 네트워크 문제라고 생각하지 않습니다. 또한 SQL 서버 프로파일 러를 실행합니다. CPU가 0이고 지속 시간이 0이며 읽기 비용이 매우 낮다는 것을 보여줍니다. – chengbo

+1

SQL 서버와 같은 단일 프로세스뿐만 아니라 전체 시스템의 CPU 사용량을 언급했습니다.동시에 서버와 클라이언트 컴퓨터에서 실행되는 많은 프로세스가 있으며, 모든 프로세스가 주어진 순간마다 다른 CPU 사이클을 소비한다는 것을 기억하십시오. 효과를 보려면 PC에서 작업 관리자를 열고 성능 탭으로 이동하십시오. 시스템이 유휴 상태 일 때도 사용 그래프는 계속 변동합니다. – uncoder

0

데이터 판독기에서 Close()을 호출하기 전에 명령 개체에서 Cancel()을 호출 해보십시오. MSDN은 왜 이것이 도움이되는지 설명합니다.

그런 다음 테스트를 다시 실행하십시오.

관련 문제