2010-01-19 2 views
1

SQL Server 2000과 연결된 서버 2 개를 사용하여 이상한 문제가 발생했습니다. 2 년 동안 우리의 솔루션은 문제없이 실행되었지만 갑자기 어제 한 데이터베이스에서 다른 데이터베이스로 데이터를 동기화하는 쿼리가 시간 초과되었습니다.C# .NET의 SQL Server 시간 초과 2000

데이터가 필요한 주문이 포함 된 서버에 연결되어있는 프로덕션 네트워크의 서버에 연결합니다.

쿼리는 몇 조인이 포함되어 있지만, 기본적으로이 이루어집니다 무엇을 요약 한 문제를 해결하기 위해

INSERT INTO ProductionDataCache 
    (column1, column2, ...) 
    SELECT tab1.column1, tab1.column2, tab2.column1, tab3.column1 ... 
     FROM linkedserver.database.dbo.Table1 AS tab1 
     JOIN linkedserver.database.dbo.Table2 AS tab2 ON (...) 
     JOIN linkedserver.database.dbo.Tabl32 AS tab3 ON (...) 
     ... 
     WHERE tab1.productionOrderId = @id 
     ORDER BY ... 

분명히 내 첫 번째 시도는 원래 오분에서 시간 제한을 증가했다. 그러나 30 분에 도착했을 때 타임 아웃이 생겼을 때, 나는 다른 일이 일어나고 있다고 의심하기 시작했습니다. 쿼리는 밤에 5 분 미만에서 30 분 이상 실행되지 않습니다.

SQL 쿼리 (원래 C# 코드에 있던)를 내 로그에 출력하고 데이터베이스 서버에서 직접 쿼리 분석기에서 쿼리를 실행하기로 결정했습니다. 놀랍게도 쿼리가 10 초 이내에 올바르게 실행되었습니다.

간단한 테스트 프로그램에서 SQL 실행을 분리하여 원래이 솔루션을 실행하는 서버와 데이터베이스 서버에서 로컬로 실행할 때 같은 쿼리 시간을 모두 관찰했습니다. 또한 저장 프로 시저를 만들고 프로그램에서 실행하려고 시도했지만이 또한 시간이 초과됩니다. 쿼리 분석기에서 실행하면 몇 초 안에 정상적으로 작동합니다.

이 문제는 C# 프로그램에서이 쿼리를 실행할 때만 발생하는 것으로 보입니다. 누구든지 전에 그런 행동을 보았고 그것을위한 해결책을 찾았습니까?

업데이트 : 이제 SQL 프로필러를 서버에서 사용했습니다. 확실한 차이점은 .NET 프로그램에서 쿼리를 실행할 때 "exec sp_executesql N'INSERT INTO ... '"로 로그에 나타나지만 쿼리 분석기에서 실행하면 로그의 일반 쿼리로 발생합니다 .

또한 SQL 쿼리 분석기를 프로그램과 동일한 SQL 사용자를 사용하여 연결하려고 시도했으며 쿼리 분석기에서도이 문제가 발생했습니다. 그래서 문제는 SQL 사용자를 사용하여 TCP/IP를 통해 연결할 때만 발생합니다.

+1

이 코드를 실행하는 로그인이 잠겨 있거나 도메인이 변경되지 않았는지 확인 했습니까? 또한 보안 문제와 비슷한 것으로 들립니다. 프로그램이 어떤 계정에서 실행되고 있습니까? – JonH

+0

프로그램이 실제로 DB 서버와 통신하고 그 결과를 얻을 수 있는지 확인하기 위해 간단한 SELECT COUNT (*) 쿼리를 실행 해 보았습니다. 이것은 잘 동작했다. –

답변

0

조사해야 할 몇 가지 사항이 있습니다. 첫 번째는 SET 옵션입니다; 이들은 거대한 일부 쿼리에 차이를 만들 수 있습니다. 추적에서 SET 옵션을보고 Management Studio (또는 쿼리 분석기)에서 테스트 할 때이 옵션을 반복하십시오. 실제 프로필 세션을보아야 만합니다 ( 코드 로그가 아닌).

다음으로 살펴볼 것은 트랜잭션입니다. 어떤 트랜잭션 모델을 C#에서 사용하고 있습니까? 어떤? 없음? 어떤 격리? Serializable? 아마도 배포 되었습니까? 테이블 위에 어둡게 잠긴 자물쇠가있을 수 있습니다.

물론 잠금이 문제가되는 경우 쿼리가 실행되는 동안 sp_who/sp_who2을 통해 무언가를 볼 수 있습니다.