2015-05-28 24 views
0

我找不出需要創建什麼類型的索引,以便下面的查詢不會導致執行計劃中的兩種排序。分析函數索引First_Value

SELECT DISTINCT 
    col_A, 
    FIRST_VALUE (col_B) OVER (PARTITION BY col_A ORDER BY col_C DESC) AS x 
FROM table_A 

上表的主鍵是爲col_a,col_C,這也是當前執行計劃: enter image description here

有擺脫兩類的一種方式?

+0

您是否嘗試過使用數據庫引擎優化顧問? – Stephan

+1

在黑暗中拍攝一張照片:'CREATE INDEX IDX_xyz ON table_A(col_A,col_C DESC)INCLUDE(col_B)' –

+0

我只是不知道你會擺脫兩種。直到它結束之後,它纔會知道FIRST_VALUE(col_B)。如果你有在col_A上的索引,col_C DESC應該是一個快速排序。你有性能問題嗎? – Paparazzi

回答

1

我嘗試了一個約700.000行(產生25.000行作爲結果)的表上類似的查詢。在接下來的最後一步中,我得到了「哈希匹配(集合)」,而不是「排序(獨特排序)」。沒有任何索引(聚集索引除外),第二步是對Col_A和Col_C進行排序。

在創建Zoff Dino建議的索引之後,不再需要排序(只保留哈希匹配)。

不過,我得到了下面的查詢一個更好的計劃(和稍短的執行時間)(應提供相同的結果):

SELECT col_A, x FROM (
    SELECT col_A, 
     FIRST_VALUE(col_B) OVER (PARTITION BY col_A ORDER BY col_C) AS x, 
     ROW_NUMBER() OVER (PARTITION BY col_A ORDER BY col_C) AS RowNum 
    FROM table_A 
) q 
WHERE RowNum=1