2012-03-23 252 views
0

我有這樣的SQL視圖SQL視圖非常緩慢執行

SELECT  
    dbo.CustomFilterDetails.CustomFilterID, 
    dbo.ItemCustomParameters.CustomFilterDetailsID, 
    dbo.Item.ItemID 
FROM   
    dbo.ItemCustomParameters 
INNER JOIN 
    dbo.CustomFilterDetails ON dbo.ItemCustomParameters.CustomFilterDetailsID = dbo.CustomFilterDetails.CustomFilterDetailsID 
INNER JOIN 
    dbo.Item ON dbo.Item.ItemName LIKE dbo.ItemCustomParameters.Value 
INNER JOIN 
    dbo.ItemParameter ON dbo.ItemParameter.ItemID IS NULL 
         OR dbo.ItemParameter.Value LIKE dbo.ItemCustomParameters.Value 
         OR dbo.ItemParameter.Name LIKE dbo.ItemCustomParameters.Name 

爲什麼如此慢的工作?

+2

喜歡和ORs,也許。或者缺乏索引。 – 2012-03-23 15:09:58

+0

嘗試用WHERE子句替換JOIN子句。它應該更快.. – 2012-03-23 15:10:03

+1

Wee需要更多的信息來回答這個問題。表格定義,索引,執行計劃等 – Lamak 2012-03-23 15:11:06

回答

0

您不需要從視圖中調用索引。索引用於對錶格中的數據進行排序並存儲它們,這些數據將隨時可用。這對提高性能有很大的幫助。只需創建索引並運行此視圖並查看它是否有所作用

1

您的問題是此查詢中的LIKE子句。 LIKE用於模式匹配,除非您在所有要比較的列上定義了全文索引,否則不會使用針對這些列創建的索引。您應該使用「=」代替,並確保下列指標存在:

Item.ItemName 
ItemParameter.Value 
ItemParameter.Name 
ItemCustomParameters.Value 
ItemCustomParameters.Name 

我假設你已經有

ItemCustomParameters.CustomFilterDetailsID 
CustomFilterDetails.CustomFilterDetailsID 

指標我認爲你是LIKE到包括其值在不同情況下的匹配?如果情況並非如此,那麼用LI替換LIKE已經解決了你的問題。否則,請對相關字段使用不區分大小寫的排序規則。然後,你可以比較不同的使用=的情況下,琴絃不會丟失索引的好處:

ALTER TABLE Item ALTER COLUMN ItemName NVARCHAR(200) COLLATE LATIN1_GENERAL_CI_AS 
ALTER TABLE ItemParameter ALTER COLUMN Name NVARCHAR(200) COLLATE LATIN1_GENERAL_CI_AS 
ALTER TABLE ItemParameter ALTER COLUMN Value NVARCHAR(200) COLLATE LATIN1_GENERAL_CI_AS 

...等

然後更換如上所述=喜歡和創建索引,它應該工作得很好,雖然還不夠理想。如果在此之後仍然遇到性能問題,請考慮使用整數鍵鏈接Item,ItemParameter和ItemCustomParaeter表。不知道你的數據庫結構,我不能給你更多的信息,但實際上這意味着將參數匹配到參數的任務是在創建或分配參數時完成的,而不是每次都是視圖調用。