2011-11-02 2 views
0

안녕하세요. 미리 감사드립니다.SQL Server - 두 날짜 사이를 검색하는 최상의 방법

나는 누군가가 쓴 45 가지 저장 프로 시저에서 문제점을 발견했으며 성능이 상당히 떨어 졌다고 설명했다. 나는 약 5 분 만에 문제를 발견하고 테스트를 실시했으며 45 초 중 하나에 대해 60 초에서 4 초로갔습니다. 인덱스가 사용되지 않고 테이블 스캔이 1000 만 + 기록. 이 테이블은 SQL Server 2005를 사용합니다.

테이블은 감사 로그이며 레코드가 특정 값을 가질 때 updt_tmstmp를 가져 오기 위해 저장된 proc에 의해 쿼리됩니다. 나는 "NOT IN"대 8 "product_code <> 'XX'"문을 사용하도록 아래 코드 블록을 변경했으며 인덱싱 된 열 updt_tmstmp를 사용하도록 첫 번째 datediff를 변경했으며 AUDIT_LOG.updt_tmstmp> @dtStartDate가 달성 할 수있는 검사를 추가했습니다. 성과가 증가한다. 나는 이것이 다르게 (더 우아하게) 구현 될 수 있다고 생각한다. 개선에 대한 생각이나 아이디어에 감사드립니다.

WHERE 
    PRODUCT.product_code NOT IN ('D01', 'D02', 'D03', 'D04', 'D05', 'D06', 'D07', 'D99') AND 
AUDIT_LOG.updt_tmstmp >= @dtStartDate AND 
    --Compares that the date entered is between the two date parameters 
    (DATEDIFF(dd,GETDATE(),AUDIT_LOG.updt_tmstmp) 
     BETWEEN DATEDIFF(dd,GETDATE(),@dtStartDate) 
     AND DATEDIFF(dd,GETDATE(),@dtEndDate)) 
    AND AUDIT_LOG.event_id = (SELECT MIN(AUDIT_LOG.event_id) 
       FROM L_EVENT_LOG 
           WHERE AUDIT_LOG.transaction_id = PRODUCT.transaction_id AND            AUDIT_LOG.queue = 'AP') 

답변

1

audit_log.updt_tmstmp과의 비교는 약간 이상해 보입니다.

AUDIT_LOG.updt_tmstmp >= @dtStartDate AND 
    --Compares that the date entered is between the two date parameters 
    (DATEDIFF(dd,GETDATE(),AUDIT_LOG.updt_tmstmp) 
     BETWEEN DATEDIFF(dd,GETDATE(),@dtStartDate) 
     AND DATEDIFF(dd,GETDATE(),@dtEndDate)) 

같은 생각입니다.

audit_log.updt_tmstmp >= @dtStartDate and 
audit_log.updt_tmstmp < @dtEndDate 

상관 관계가있는 하위 쿼리를 어떻게 처리해야할지 모르겠습니다. where 절에서 외부 쿼리의 필드를 사용하며 l_event_log의 필드는 사용하지 않습니다. 대신 where 절을 기본 쿼리로 이동해야합니다.

아마도 이와 비슷한 것일 수 있습니다.

where product.product_code not in ('D01', 'D02', 'D03', 'D04', 
            'D05', 'D06', 'D07', 'D99') and 
     audit_log.updt_tmstmp >= @dtStartDate and 
     audit_log.updt_tmstmp < @dtEndDate and 
     audit_log.transaction_id = product.transaction_id and 
     audit_log.queue = 'AP' and 
     l_event_log.event_id = (select min(audit_log.event_id) 
           from l_event_log)  
+0

예, audit_log.updt_tmstmp가 이상하게 보입니다. 그렇습니다. 상관 관계가있는 하위 쿼리는 새 편집이 완료되었습니다. dev 환경에서 인덱스를 사용하고 테이블 이름을 변경하지 않았습니다.

1

나는 GETDATE()를 3 번 ​​호출하여 칩을 칩입니다. 그 코드가 최적화 된 상태인지 확신 할 수는 없지만 그 코드가 도움이되는지보기 위해 변수에 넣을 가치가 있습니다.

관련 문제