2016-04-15 124 views
0

我在.NET中有一個複雜的查詢。請參考下面的查詢(解釋的目的簡單查詢):參數化查詢太慢

SELECT * FROM Person WHERE Name='Ian' AND DateOfBirth='1961-04-04' 

這(生的名字和日期)

SELECT * FROM Person WHERE [email protected] AND [email protected] 

表索引。

第一個查詢從.NET運行需要幾分之一秒。第二個查詢大約需要48秒。這與執行計劃有關嗎?我能做些什麼來強制SQL Server重新創建執行計劃嗎?

我看到這個問題:https://dba.stackexchange.com/questions/530/how-do-you-clear-out-all-old-query-plans-from-within-microsoft-sql-server。但是,這對於存儲過程更是如此。

+0

我不確定當你沒有向我們展示可以重現問題的真實代碼或代碼時,我們如何準確診斷問題。 – Becuzz

+0

@Becuzz,Gordon Lindoff能夠準確診斷問題。 – w0051977

回答

5

首先,您需要Person(Name, DateOfBirth)上的複合索引,而不是兩個索引(列可以按任一順序排列)。

其次,這可能與執行計劃有關。

我會建議RECOMPILE選項:

SELECT p.* 
FROM Person p 
WHERE Name = @Ian AND DateOfBirth = @DateOfBirth 
OPTION (RECOMPILE); 

什麼可以用參數化查詢發生的是,執行計劃緩存是第一次運行 - 但執行計劃可能不是最好的用於後續的調用。

如果這不起作用,那麼問題可能是數據類型,因爲數據類型不兼容可能會阻止使用索引。確保數據類型排序規則相同。您可能需要將cast()的參數設置爲適當的類型和/或使用COLLATE

+0

感謝您的及時答覆。它工作。當我允許時,我會標記答案。 +1。 – w0051977

+0

您可能不希望索引按任何順序排列。首先選擇最具選擇性的指數。 –