2012-10-19 51 views
0

讓我們直奔到例如:意見遠遠低於選擇爲

查詢1:

Select * 
Into #temp_v1 
From View1 

Select * 
Into #temp_v2 
From View2 

select * 
From #temp_v1 v1 
where not exists (
    Select * From #temp_v2 where key = v1.key 
) 

這比

快得多

查詢2:

select * 
From View1 v1 
where not exists (
    Select * From View2 where key = v1.key 
) 

現在顯然,我簡化了這個例子。 View1是視圖視圖,需要進行更多比較,因此難以使用聯接。

我的問題實際上不是我應該如何寫我的SQL,而是SQL Server如何在3秒鐘內執行查詢1,並在10分鐘內查詢2。

而且更重要的是有一個神奇的選項,我可以給優化器創建一個類似的查詢執行計劃1.

+0

您可能會發現這有用... http://msdn.microsoft.com/en-us/library/dd171921%28v=sql.100%29.aspx –

+0

我沒看過那篇文章 - 因爲我之前做過谷歌發佈;-) - 由於not exists子句,索引視圖無法使用。即使我可以,它也不回答爲什麼查詢1比查詢2要快100倍。 –

回答

1

如果你的看法是複雜的,那麼訪問該視圖將是操作的最慢的部分遠,並且查詢1最小化。

假設每個視圖有1,000,000行。在查詢1中,您只能從視圖中檢索一行2,000,000次,而在查詢2中,您可能會從視圖中檢索500,000,000,000次或更多的行。 (在最好的情況下,每個v1.key將存在於視圖2中。但是,您仍然必須每次檢查視圖2中的大約一半行以驗證)。

我不知道有關SQL Server執行計劃,但寫你的查詢這樣的事情也應該是更有效率:

with keys as (
    select key from View2 
) 
select * 
From View1 v1 
where not exists (
    Select * From keys where key = keys.key 
) 

通過從圖2領先的時候,你基本上是讓所有的按鍵與查詢1具有相同的效率,沒有臨時表步驟。

+0

是的!那就是訣竅。非常感謝 :-) –