sql - 如果一个表有 'id' 列作为它的聚集索引,那么在任何其他非聚集索引中添加 'id' 列作为包含列有什么好处
问题描述
如果表将“id”(主键)列作为其聚集索引,那么在 Microsoft SQLServer 中的任何其他非聚集索引中添加“id”列作为包含列有什么好处?
例如:- 表'xyz'
ID | 姓名 | 地位 | 日期 |
---|---|---|---|
1 | 美国广播公司 | 积极的 | 2021-06-23 |
CREATE NONCLUSTERED INDEX [NonClusteredIndex_status_Date]
ON [xyz]
(
[status] ASC,
[date] ASC
)
INCLUDE
( [id],
[name]
)
而这个非聚集索引的目标是在大型数据集上进行类似于下面的查询。在实际情况下,可能还有其他一些查询。
select * from xyz where status='active' and date > '2021-06-20'
解决方案
你的问题的答案基本上是不,没有好处。
在表上创建非聚集索引时,索引中的每一行都需要能够指向基表中的行。
如果基表是堆,则索引中的每一行都将包含一个指向rid(行标识符)的指针,这是 SQL Server 用来唯一标识每一行的。
当表使用聚集索引定义时,每个非聚集索引将自动包含聚集索引列作为基表中行的键。
您可以在执行计划中看到这一点,其中使用了非聚集索引,SQL Server 必须从基表中检索其他列;如果表是堆,它将是RID 查找,如果表有聚集索引,它将是键查找。
此外,如果聚集索引不是唯一的,SQL Server 会添加自己的唯一值以确保唯一性,这也包含在非聚集索引中。
因此,当涉及到非聚集索引时,是否指定聚集索引列并不重要——你可以这样做,这样做没有害处,但它/它们总是被包括在内。
推荐阅读
- python - 如何使用 Python 根据当前值填充缺失值?
- javascript - 根据 AJAX 响应启动计时器
- r - 如何更改此 ggplot 代码以使其与导入的 excel 数据一起使用?
- javascript - 如何在Javascript中对forEach循环应用条件?
- android - Flutter - 如何检测webview中特定按钮的点击?
- angular - 使用不同的变量运行 Apollo Angular watchQuery() 返回缓存数据
- azure - 如何使用 Ansible 更新 Azure 应用程序网关的实例
- javascript - WebRTC 浏览器到应用,只有浏览器获取流
- python - 从数据中获取多个值
- python - 如何修复 python manage.py 没有响应