sql - SQL Server:用于查找大于传递值的最新值的索引
问题描述
我有一个有 4 列的表
- USER_ID:数字
- EVENT_DATE:日期
- 版本:日期
- 分数:十进制
我在 ( USER_ID, EVENT_DATE, VERSION
) 上有一个聚集索引。这三个值加起来是独一无二的。
我需要获得EventDate
一组UserId
s (约 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”。
任何人都可以提示我如何设置一个可以让我提高查询性能的索引。
非常感谢您提前
解决方案
对于您的查询,最佳索引将是 on (User_ID, Version, ValueDate desc, Score)
。
不幸的是,您的聚集索引不匹配。只有第一列和第三列匹配,但它们需要按顺序匹配。因此,只有User_ID
可以提供帮助,但这可能对过滤数据没有太大作用。
推荐阅读
- android - 导航控制器和广播接收器
- python - 从没有换行符字符串的文本文件中读取路径 \n
- android - 如何在Android房间库的@query中使用where
- python-3.x - ImageView 中 ROI 的坐标
- android - Android:如何在时间选择器中比较当前时间和以前的时间?
- python - 将 textwrap.fill 应用于 python 脚本上的每个打印
- javascript - JavaScript 中的 new Object() 发生了什么
- java - 关于 Java 10 语法规范的困惑(FieldAccess 似乎是错误的)
- graphql - graphql,将大查询拆分为小查询
- c# - 如何对隐藏在其他元素中的字典进行 XML 反序列化?