sql-server - 我们是否应该使用 order by 子句中使用的列作为 NC INDEX 的包含列
问题描述
我创建了一个 NC 索引并使用“LastUpdated”作为索引中的包含列,但“LastUpdated”在我的查询中按子句顺序使用。我们应该使用 order by 子句中使用的列作为 NC INDEX 的包含列吗?
CREATE NONCLUSTERED INDEX [IXNI__symboltab__Status_active_Symbol]
ON symboltab (Status,active,Symbol)
INCLUDE (LastUpdated)
SELECT TOP 10000 symbol,LastUpdated
from symboltab
with (nolock index = IXNI__symboltab__Status_active_Symbol)
WHERE
active = 1
AND Status = 999 --999 is default
AND Symbol NOT LIKE '/%'
AND Symbol NOT LIKE '%#%'
AND Symbol NOT LIKE '!%'
ORDER BY LastUpdated ASC
解决方案
据我所知,INCLUDE
子句中列出的列不是实际 B 树索引的一部分,而是仅出现在叶节点中。这样做的结果是,对于您当前的索引,叶节点通常不会按LastUpdated
值排序。这些值将存在于叶节点中,但不能保证任何类型。因此,如果你想让你的索引有机会覆盖查询的所有部分,你应该LastUpdated
进入实际的索引结构:
CREATE NONCLUSTERED INDEX [IXNI__symboltab__Status_active_Symbol]
ON symboltab (Status, active, Symbol, LastUpdated);
推荐阅读
- javascript - Javascript 对象字面量赋值和引用是如何工作的?
- image - Xamarin Forms CarouselView 图像绑定错误
- php - 批量发送邮件后可以清除邮件对象吗?
- delphi - 检查当前用户或其他用户的窗口是否恢复(Delphi)
- python - 在另一个方法中实现一个方法的问题。面向对象编程
- python-3.x - 从另一个目录导入定制包
- visual-studio-code - 在 VSCode 中使字体变大
- c - 为什么我在不同的笔记本电脑上得到相同代码的不同输出?
- javascript - 这个标签是如何快速添加到 DOM 中的?
- node.js - VueJS:axios 在 POST 请求上返回 404 Not Found 错误