2010-05-04 2 views
1

여러 개의 조인을 사용하는 SQL 쿼리가 &인데 처리를 위해 데이터베이스에서 데이터를 가져옵니다. 이것은 일정에 따라 운영되기로되어 있습니다. 그래서 1 일째, 500 일째, 2 일째가 400 일이라고 가정합니다. C# - 시간 제한없이 데이터베이스에서 레코드를 가져옵니다.

& 어떤 이유로 서비스가 중지 된 경우 데이터가 처리되지 않고 day3에 1000 개의 레코드가 처리 될 수 있습니다. 이로 인해 SQL 쿼리에 시간 초과가 발생합니다.

타임 아웃을 발생시키지 않고이 상황을 처리하는 가장 좋은 방법 & 작업 부하가 점차 줄어들어 처리 할 수 ​​있습니까?

TIA

답변

3

일괄 처리를 만듭니다. n 개의 레코드 만 처리하도록 허용하십시오. n = 100 ... 라고 말하면 처리 할 레코드가 없어 질 때까지 상위 100 개만 선택 쿼리를 만듭니다.

YourCommandObject.CommandTimeout = 0; 

이렇게하면 명령을 영원히 돌릴 수 있습니다.

참고 데이터베이스 잠금 및 기타 문제가 발생할 수 있습니다. 위에서 설명한 일괄 처리를 사용하고 가장 오랫동안 실행중인 쿼리를 결정하면 연결 제한 시간을 필요한 값으로 설정할 수 있습니다.

+0

연결 시간 초과 제어로 연결합니다. 그것은 시간이 초과되기 전에 쿼리가 얼마나 오래 실행될 수 있는지에 영향을주지 않습니다. – Andomar

+0

죄송합니다. 제가 명령 제한 시간을 말하는 것을 의미합니다 ... 쓰레기는 명령 개체에 있습니다 ... 나는 엉망이되었습니다. –

3

쿼리를 살펴보면 최적화되지 않은 인덱스를 적절히 배치 할 수 있습니다. 테이블 구조, 쿼리를 보지 않고는 더 이상 도움이되지 않습니다.

+0

예. 이것은 OP의 숫자가 무거운 잔인한 일이나 완전히 진절머리 나는 질의를 나타내는 가장 좋은 시작입니다. 1000 개의 결과 만있는 시간 종료가 발생하지 않아야합니다. – TomTom

+0

@TomTom : 쿼리 비용과 결과 수 사이에는 아무런 관련이 없습니다. 1000 개의 결과가있는 질의는 임의의 계산 및/또는 디스크 I/O를 요구할 수 있습니다. – Andomar

+0

내가 말했듯이 - 잔인한 작업이든 무의미한 작업이든 말입니다. 통계적으로 관련이 있습니다 - 1000 개의 결과는 평균적으로 10.000.000보다 적은 자원입니다. 대부분의 쿼리에서 1000 개의 결과가 몇 초 이내에 나타납니다. 결과에서 소량의 데이터가 주어지면 최적화를 가리키는 것이 유효한 대답입니다. – TomTom

1

한 실용적인 솔루션 명령 타임 아웃을 증가시키는 것이다 :

var com = yourConnection.CreateCommand(); 
com.CommandTimeout = 0; 
... 

CommandTimeout 속성 실행할 명령을 기다리는 시간 (초)이다. 기본값은 30 초입니다. 값 0은 제한이 없음을 나타내며 명령 실행 시도가 무기한 대기하기 때문에 CommandTimeout에서 피해야합니다.

관련 문제