2013-01-16 126 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

創建索引視圖:

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) 

,然後在表上創建一個索引:

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

,然後使用該查詢:

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' 
+0

完美,謝謝 – Ben

3

做對的形式%圖案%文本列模式匹配迫使匹配WHERE條件(如果有上名的索引,它不能無論如何使用)外的所有記錄的掃描。

我會冒險猜測您的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