2013-04-19 2 views
-1

요구 사항에 따라 행과 통계를 가져 오는 간단한 쿼리 (예 : Select top 10 records, joins, counts, group by)를 실행하고 있습니다. 테이블에는 약 150,000 ~ 200,000 개의 행이 있습니다. 모든 기본 키와 외래 키는 잘 정의되어 있습니다.큰 테이블에 대한 쿼리가 SQL Server에서 시간 초과가 발생했습니다

그러나 쿼리를 실행하는 동안 임의로 시간 초과 오류가 발생합니다. 동일한 쿼리 또는 저장 프로 시저를 완료하는 데 다른 시간이 필요합니다. 데이터베이스는 공유 서버에서 호스팅됩니다. 명령 대기 시간 속성을 600으로 설정했지만 작동하지 않습니다. 서비스 제공 업체는 처리가 완료되지 않으면 시스템이 30 초 후에 쿼리를 종료한다고 말했습니다. 그들은 시간을 맞추기 위해 쿼리를 조정하라고했습니다.

예 :

CREATE PROCEDURE [dbo].[NP_TableReport] 
( 
@CreatedOnFrom datetime = NULL, 
@CreatedOnTo datetime = NULL 
)  
AS  
BEGIN 

SELECT COUNT(ID) [Count]  
FROM Table1 
WHERE  
    (@CreatedOnFrom IS NULL OR @CreatedOnFrom <= CreatedOn) 
AND (@CreatedOnTo IS NULL OR @CreatedOnTo >= CreatedOn) 
END 

랜덤 타임 아웃 오류의 원인을 알려주십시오. 전담 서버에서 똑같은 것을 시도했을 때 오류가 사라졌습니다. 아무도 무슨 일이 일어나는지 설명해 주시겠습니까?

+0

태양 광 플레어? 폭동? 진동? –

+0

테스트를 수행하는 동시에 같은 테이블을 쿼리 할 수있는 다른 프로세스가 있습니까? – mbeckish

+0

외래 키가이 쿼리에서 거의 영향을 미치지 않는 것처럼 보입니다. 실제로 CreatedOn에 * 인덱스 *가 있습니까? –

답변

0

200,000 개 이상의 튜플의 경우 평균 쿼리를 완료하는 데 30 초 이상 걸릴 수 있습니다. 호스팅 제공 업체에서 검색어를 30 초 이상 사용할 수없는 경우 클라이언트 측 기술을 사용하여 데이터를 가져 와서 필터링 해보십시오. 그렇다고해도 작동하지 않으면 호스팅 제공 업체를 변경하거나 응용 프로그램에 대해 별도의 데이터베이스 호스팅을 구입하는 것을 고려하십시오.

"createdOn"열에 이미 색인을 생성했다고 언급했습니다. 귀하의 쿼리 및 데이터베이스 상태가 현재 가장 최적화 된 형태라고 생각합니다. 호스팅 제공 업체가 부과 한 제한 시간 제한 만 제거하면 문제가 해결 될 수 있습니다.

+0

호스팅 제공 업체에 대한 제안 사항이 있으십니까? – Zubarik

4

Table1의 색인을 CreateOn 필드에 추가하는 것으로 시작하십시오.

특별히 id 열의 널값이 아닌 경우를 제외하고 count(id) 대신 count(*)을 사용하십시오.

는 입력 값에 따라 네 가지 질문이, 그래서 그것들을 전문으로하는 데 도움이 될 수 있습니다 :

if (@CreatedOnFrom is null and @CreatedOnTo is null) begin 

    select count(*) [count] 
    from Table1 

end else if (@CreatedOnFrom is null) begin 

    select count(*) [count] 
    from Table1 
    where @CreatedOnTo >= CreatedOn 

end else if (@CreatedOnTo is null) begin 

    select count(*) [count] 
    from Table1 
    where @CreatedOnFrom <= CreatedOn 

end else begin 

    select count(*) [count] 
    from Table1 
    where @CreatedOnTo >= CreatedOn and @CreatedOnFrom <= CreatedOn 

end 
+0

이미 색인이 CreatedOn 필드와 함께 추가되었습니다. – Zubarik

+0

저장 프로 시저에 대한 쿼리 실행 계획을 게시 할 수 있습니까? –

0

내가 미리 할 수 ​​있으면 내가 쿼리에 너무 많은 계산을 두지 것 같아요. nulls의 불평등은 대개 IMX입니다. Table1.CreatedOn는 자정 이후의 시간 구성 요소를 포함하지만 단지 절차에 날짜를 입력하려면, 대신 이것을 사용해야 할 수도

CREATE PROCEDURE [dbo].[NP_TableReport] 
( 
@CreatedOnFrom datetime = NULL, 
@CreatedOnTo datetime = NULL 
)  
AS  
BEGIN 

SET @CreatedOnFrom = COALESCE(@CreatedOnFrom, CAST('01/01/1753' as datetime)) 
SET @CreatedOnTo = COALESCE(@CreatedOnTo, CAST('12/31/9999' as datetime)) 

SELECT COUNT(ID) [Count]  
FROM dbo.Table1 
WHERE CreatedOn BETWEEN @CreatedOnTo AND @CreatedOnFrom 

END 

참고 :

SET @CreatedOnTo = COALESCE(DATEADD(day,1,@CreatedOnTo), CAST('12/31/9999 23:59:59' as datetime)) 

당신은 심지어에서 두 번째를 뺄 수 DATEADD에 지정된 날짜의 마지막 초를 가져 오려면

COALESCE 문을 WHERE 절에 넣을 수는 있지만 읽기가 더 쉽습니다.

관련 문제