2011-02-09 2 views
0

SQL 서버 설치의 성능 문제를 도와 달라는 요청을 받았습니다. SQL Server 전문가는 아니지만 한 번 살펴보기로했습니다. OK로 작동하는 닫힌 소스 응용 프로그램을 사용하고 있습니다. 그러나 2000 년에서 2005 년 사이에 SQL Server를 업그레이드 한 후 응용 프로그램 성능이 크게 떨어졌습니다. SQL 프로파일 러를 실행하고 다음 쿼리 (무죄를 보호하기 위해 필드 이름이 변경됨)가 실행될 때까지 약 30 초가 걸렸습니다. 내 첫 번째 생각은 내가 쿼리를 최적화해야한다는 것이었다. 그러나 응용 프로그램이 폐쇄 된 소스이고 공급 업체가 도움이되지 않는다면 이는 불가능합니다. 그래서이 쿼리를 변경하지 않고 빠르게 실행하는 방법을 알아 내려고 노력 중입니다. 또한 이전 SQL Server 2000 제품에서이 쿼리가 어떻게 더 빨리 실행되었는지도 분명하지 않습니다. 아마도 새로운 SQL 서버에서 수행되지 않거나 작동하지 않는 인스턴스에 적용되는 일종의 성능 조정이있었습니다. DBCC PINTABLE이 떠오른다.Microsoft SQL Server : 멍청한 쿼리의 성능을 향상시키는 방법?

select min(row_id) from Table1 where calendar_id = 'Test1' 
and exists 
    (select id from Table1 where calendar_id = 'Test1' and 
     DATEDIFF(day, '12/30/2010 09:21', start_datetime) = 0 
    ) 
and exists 
    (select id from Table1 where calendar_id = 'Test1' and 
     DATEDIFF(day, end_datetime, '01/17/2011 09:03') = 0 
    ); 

표는 약 6200 항목을 가지고 다음과 같습니다

어쨌든, 여기서 문제가되는 쿼리입니다. 나는 효과가없는 다양한 지표를 만들려고 노력했다.

id     calendar_id start_datetime end_datetime 
int, primary key varchar(10) datetime  datetime 
1     Test1  2005-01-01... 2005-01-01... 
2     Test1  2005-01-02... 2005-01-02... 
3     Test1  2005-01-03... 2005-01-03... 
... 

누군가가이 수수께끼를 해결하는 데 도움이된다면 매우 감사드립니다.

미리 감사드립니다.

+0

이 코드는 저장 프로 시저에 있습니까? SP 매개 변수가 구동됩니까? –

답변

1

색인이 변환되었는지 확인하십시오. 그런 다음 통계를 업데이트하십시오.

+0

인덱스가 실제로 다른 점이 있습니까? Where 절에 함수를 추가하면 실행될 때마다 테이블 스캔이 강제 실행되지 않습니까? – Thomas

1

이전 SQL Server의 실행 계획과 새로운 계획의 차이점을 확인하십시오.

create index <indexname> 
    on table (calendar_id, id) 
    include (start_datetime, end_datetime); 

이의 min(row_id) 종류를 calendar_id = 'Test1' 조건을 만족와 비 SARG-수 DATEFIFF 조건을 평가하기 위해 자료를 제공합니다 도움이 될 것입니다 http://www.sql-server-performance.com/tips/query_execution_plan_analysis_p1.aspx

2

한 가지 CALENDAR_ID에 커버링 인덱스 . 테이블에 다른 열이 없다면 필요한 클러스터 된 인덱스 일 수 있으며 id 기본 키는 클러스터되지 않은 인덱스 여야합니다.

+0

각 행에서 DateDiff를 평가하기 위해 테이블 ​​스캔을 수행해야합니까? – Thomas

+1

@ 토마스 : 내가 말했듯이, DATEDIFF는 SARG가 불가능합니다. –

0

Remus Rusanu의 인덱스 제안을 넘어서 할 수있는 유일한 다른 작업은 SQL Server 2005 및 2008 Enterprise Edition의 고급 검색 기능이있는 엔터프라이즈 버전으로 업그레이드하는 것입니다. 테이블 스캔.

그 외에도 쿼리를 변경할 수 없다면 할 수있는 일은 없다고 생각합니다. 그 이유는 쿼리가 Where 절의 함수 결과와 비교를 수행하기 때문입니다. 즉, SQL Server가 실행될 때마다 Table1에서 테이블 검색을 수행하도록합니다.

Reading Pages (more info about Advanced Scanning)

관련 문제