2012-11-21 100 views
0

基本上,我有一個臨時表,我用不同的技術填充表中的相同數據,以找到我的情況中最快的一個。這三種方法是:不同的執行計劃與臨時表相同日期

  1. 選擇使用聯接
  2. 選擇其中大部分 表/邏輯/計算被包括在內聯函數
  3. 選擇插入的信息插入信息插入信息,其中大部分 表/表值函數中包含邏輯/計算結果

使用每種方法時,表中都會填充相同的數據,並使用表值函數獲得最佳性能。但這裏的事情很奇怪。

臨時表填充後,會對所有列使用GROUP BY和ORDER BY對其進行簡單SELECT。因爲數據是我期望的一樣執行計劃一樣,但是我得到這個:

enter image description here

其中第一行是表值函數,第二個執行計劃的執行計劃第一種和第二種方法。

爲什麼我有兩個不同的執行計劃表具有相同的數據?爲什麼它不總是使用第一個,因爲它比第二個更快?

請注意,因爲這與正在對數據進行排序和分組有關,所以當我使用表值函數時,可能日期已經排序,但簡單選擇結果會顯示數據在在每種情況下都是一樣的。

+0

哇你應該在查詢優化器的早期出現過。查詢優化器只能在查詢結構內運行。你今天仍然可以提示。連接,存在和相交都可以是通常具有不同查詢計劃的等同查詢。 – Paparazzi

+0

在這種情況下,我專注於最後一個SELECT,目的是使用ORDER BY和GROUP BY子句顯示臨時表中的所有記錄。因爲我有相同的信息,我期待着相同的計劃。我沒有比較我使用不同方法的陳述的第一部分。 – gotqn

+0

所以不清楚。你的問題是關於你甚至沒有發佈的選擇語句? – Paparazzi

回答

0

還有更多的執行計劃比數據

Only In A Database Can You Get 1000% + Improvement By Changing A Few Lines Of Code

東西看看這樣是不是SARGAble和次優計劃將創建

where year(payment_dt) = year(getDate()) 
and month(payment_dt) = month(getDate()) 

優化器將創建一個最佳的計劃

where payment_dt >= dateadd(mm, datediff(mm, 0, getdate())+0, 0) 
and payment_dt < dateadd(mm, datediff(mm, 0, getdate())+1, 0) 

這兩個將返回相同的行,一個將使用查找,另一個掃描,因爲功能在列周圍使用

相關問題