我无法弄清楚我需要创建哪种索引,以便以下查询不会在执行计划中导致两种排序。
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,这是当前的执行计划:
有没有办法摆脱这两种?
答案 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