2013-01-16 4 views
1

다음 쿼리는 비즈니스 인텔리전스 대시 보드에서 파이를 만드는 데 사용됩니다. 쿼리가 실행되고 올바른 데이터를 반환하지만 매우 느립니다 (약 36 초). 누구든지이 쿼리를 최적화하는 방법을 볼 수 있습니까? 양식 % 패턴 %의 텍스트 컬럼에 패턴 일치를 수행SQL 서버 쿼리가 매우 느리게 실행 중임

SELECT 
Name, 
Date, 
Severity, 
PMissing 


FROM 
(
SELECT 
Name, 
Date, 
Severity, 
PMissing, 

DENSE_RANK() OVER (PARTITION BY Name ORDER BY ate DESC) AS Rnk 

FROM PctbyP 

WHERE (Name like '%front-%' 
OR Name like '%back-%' 
OR Name like '%ap-%' 
OR Name like '%mps-%' 
OR Name like '%mg-%') 
)t 
WHERE rnk=1 
AND PMissing != '0' 
+0

테이블에있는 레코드 수와 반환되는 레코드 수는 얼마나됩니까? – Quassnoi

+0

테이블에 816,144 레코드가 있고 쿼리에서 21을 반환합니다.이 테이블에 대한 읽기/쓰기 권한이 없습니다. 이 테이블에는 자동 검사 결과가 저장됩니다. – Ben

+0

'like '% front - %''('%'와 함께''LIKE')는 당신이 가질지도 모르는 어떤 인덱스도 피할 수 있고 테이블의 각 추가 행이 느려지고 느려질 것입니다. –

답변

1

는 인덱싱 된 뷰 만들기 :

SELECT pa.* 
FROM V_PctbyP_Name vp 
CROSS APPLY 
     (
     SELECT TOP 1 WITH TIES 
       Name, [Date], Severity, PMissing 
     FROM PctbyP p 
     WHERE p.Name = vp.Name 
     ORDER BY 
       [Date] DESC 
     ) pa 
WHERE (
     vp.Name LIKE '%front-%' 
     OR 
     vp.Name LIKE '%back-%' 
     OR 
     vp.Name LIKE '%ap-%' 
     OR 
     vp.Name LIKE '%mps-%' 
     OR 
     vp.Name LIKE '%mg-%' 
     ) 
     AND pa.PMissing <> '0' 
,369 :

CREATE INDEX 
     IX_PctbyP_Name_Date 
ON  PctbyP (Name, [Date]) 

는,이 쿼리를 사용 :

CREATE VIEW 
     V_PctbyP_Name 
WITH SCHEMABINDING 
AS 
SELECT Name, COUNT_BIG(*) AS Cnt 
FROM dbo.PctbyP 
GROUP BY 
     Name 

CREATE UNIQUE CLUSTERED INDEX 
     UX_V_PctbyP_Name 
ON  V_PctbyP_Name (Name) 

는 다음 테이블에 인덱스를 만듭니다

+0

완벽하게 고맙습니다. – Ben

3

는 조건 (이름에 인덱스가 있다면, 그것은 어쨌든 사용할 수 없습니다) 외부 일치하는 모든 레코드 스캔을 강제로.

WHERE 조건이 매우 선택적인 것은 아니므로 표의 행 수가 적어 LIKE 조건과 일치하는지 확인해야합니다. 내 가정에 해당하는 경우, 당신은 오히려

구조화되지 않은 텍스트 많은 양의 데이터에 대한 쿼리 LIKE http://msdn.microsoft.com/en-us/library/ms142571.aspx

LIKE보다 전체 텍스트 검색을 사용하여 상당한 성능 향상을 볼 수 있습니다

보다 훨씬 느립니다 동일한 데이터에 대한 동일한 전체 텍스트 쿼리 수백만 행의 텍스트 데이터에 대한 LIKE 쿼리는 반환하는 데 몇 분이 걸릴 수 있습니다. 전체 텍스트 쿼리는 반환되는 행 수에 따라 동일한 데이터에 대해 초 이하의 시간이 소요될 수 있습니다.

http://msdn.microsoft.com/en-us/library/ms142571.aspx#like

+0

나는 이것을 시도하고 "전체 텍스트 인덱싱되지 않기 때문에 테이블이나 인덱싱 된 뷰에 CONTAINS 또는 FREETEXT 조건자를 사용할 수 없습니다. '라는 메시지를 받았습니다. – Ben

관련 문제