【问题标题】:SQL Server : index for finding latest value which is greater than a passed valueSQL Server:用于查找大于传递值的最新值的索引
【发布时间】:2020-02-04 12:14:32
【问题描述】:

我有一个有 4 列的表格

  • USER_ID:数字
  • EVENT_DATE:日期
  • 版本:日期
  • 分数:十进制

我在 (USER_ID, EVENT_DATE, VERSION) 上有一个聚集索引。这三个值加起来是唯一的。

我需要为Score 大于特定值的一组UserIds(约1000 个不同的ID)获取最大EventDate,并且只考虑那些具有特定Version 的条目。

SELECT M.*
FROM (VALUES 
        (   5237    ),
        ………1000 more
        (   27054   ) ) C (USER_ID)
CROSS APPLY 
    (SELECT TOP 1 C.USER_ID, M.EVENT_DATE, M.SCORE
     FROM MY_HUGE_TABLE M                   
     WHERE C. USER_ID = M. USER_ID 
       AND M.VERSION = 'xxxx-xx-xx' 
       AND M.SCORE > 2 --Comment M.SCORE > 2
     ORDER BY M.EVENT_DATE DESC) M

执行查询后,由于 score 列上缺少索引(我想),我的运行时结果很差。

如果我删除“M.SCORE > 2”上的过滤,我的结果会快十倍,但最新的分数可能小于“2”。

谁能告诉我如何设置一个索引来提高我的查询性能。

非常感谢您

【问题讨论】:

  • 如果版本不是很挑剔,而且你总是选择一个特定的,那么过滤索引真的会给它带来麻烦

标签: sql sql-server performance indexing


【解决方案1】:

对于您的查询,最佳索引将位于 (User_ID, Version, ValueDate desc, Score)

很遗憾,您的聚集索引不匹配。只有第一列和第三列匹配,但它们需要按顺序匹配。因此,只有User_ID 可以提供帮助,但这可能对过滤数据没有太大作用。

【讨论】:

  • 嗨,戈登,对不起,我在示例代码中犯了一些错字。我将 ValueDate 与 EVENT_DATE 混淆了。
  • 为此目的将我的“SCORE”列添加到索引中是否有意义?因为 (USER_ID, VERSION, EVENT_DATE, SCORE) 似乎不合适,因为每个 EVENT_DATE 只有一个 SCORE 可能只有开销
  • @user2989815 。 . .是的。我想我对你是否想要那个过滤器感到困惑。你的问题很清楚;这是我的困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
  • 2017-12-10
相关资源
最近更新 更多