2011-11-18 84 views
1

我不是TSQL的專家,但我不知道這樣的事情是可能的:是否可以 - 或建議 - 索引內聯查詢以提高性能?

想象我有一個選擇加入到一個表,該表是另一個查詢結果集:

SELECT * 
FROM tProduct 
JOIN (SELECT ProductId FROM ...... -- some other joins) tInlineQuey 
ON tInlineQuery.ProductId = tProduct.Id 
WHERE tInlineQuery. -- some econdition 

是否有可能還是有意義的在tInlineQuery上創建一個indedx,以便對該結果集應用過濾可以執行得更快?
如果是這樣,它怎麼可能?

回答

3

不,您可以在子查詢中的對象上有合適的索引,但不能像在那裏那樣向子查詢添加臨時索引。您可以查詢提示數據加入方式,例如嵌套循環,合併或散列連接 - 但優化器往往會做出正確的決定。

獲得該效果的一個選項是將該子查詢的結果選擇到臨時表中,並在該處放置索引,然後加入該臨時表。

要做到這一點,你需要一個存儲過程,包括下面的代碼:

SELECT yourFields 
INTO #TempTableName 
JOIN SomeOtherTables 
WHERE SomeField=SomeValue; 

CREATE CLUSTERED INDEX SomeIndexName ON #TempTableName(SomeField,AnotherField); 

SELECT * 
FROM tProduct p 
JOIN #TempTableName t ON t.SomeField = p.SomeField 
... 

DROP TABLE #TempTableName -- optional, the table will die when it goes out of scope at the end of the procedure. 

該臨時表的索引沒有被聚集,這就是到你的選擇。

+0

如果不是太複雜,你能寫我如何在我的scenerio的臨時表上創建一個索引嗎?謝謝 – pencilCake

3

安德魯有一個很好的答案,但如果這是一個子查詢,你會經常使用,另一種選擇是創建一個索引視圖。有幾篇關於這方面的優秀文章,其中包括我在SqL Server Central編寫的題爲On Indexes and Views的文章。

+0

+1:我肯定會同意這一點,如果它將被大量使用,並且索引視圖可能是更好的選擇。 (很難說沒有使用模式,插入率等) – Andrew

相關問題