【问题标题】:Index for Analytic Function First_Value分析函数 First_Value 的索引
【发布时间】:2015-08-11 07:01:15
【问题描述】:

我不知道我需要创建什么样的索引才能使以下查询不会在执行计划中导致两次排序。

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上,这是当前的执行计划:

有没有办法摆脱这两种情况?

【问题讨论】:

  • 您是否尝试过使用数据库引擎优化顾问?
  • 黑暗中的一枪:CREATE INDEX IDX_xyz ON table_A (col_A, col_C DESC) INCLUDE (col_B)
  • 我只是不知道你会摆脱两种。直到它完成之后才知道 FIRST_VALUE (col_B)。如果您在 col_A、col_C DESC 上有索引,那应该是一种快速排序。您有性能问题吗?
  • @ZoffDino 不幸的是,这没有用。
  • @Stephan 它没有给我任何建议,但我直到现在才知道这个程序!很好地保留在我的后袋中,以备将来的性能调整需要。

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


【解决方案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

【讨论】:

    猜你喜欢
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2021-12-03
    相关资源
    最近更新 更多