分析函数First_Value的索引

时间:2015-05-28 16:26:16

标签: sql-server performance tsql indexing sql-server-2014

我无法弄清楚我需要创建哪种索引,以便以下查询不会在执行计划中导致两种排序。

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

有没有办法摆脱这两种?

1 个答案:

答案 0 :(得分:1)

我在一个包含大约700,000行的表上尝试了类似的查询(结果产生25.000行)。在倒数第二步中,我得到一个" Hash Match(Aggregate)"而不是" Sort(Distinct Sort)"。没有任何索引(聚集索引除外),第二步是对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