首页 > 解决方案 > SQL Server:用于查找大于传递值的最新值的索引

问题描述

我有一个有 4 列的表

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

我需要获得EventDate一组UserIds (约 1000 个不同的 id)的最大值,其中 sScore大于特定值,并且只考虑那些具有特定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”。

任何人都可以提示我如何设置一个可以让我提高查询性能的索引。

非常感谢您提前

标签: sqlsql-serverperformanceindexing

解决方案


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

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


推荐阅读