Lum*_*mpy 2 index sql-server clustered-index sql-server-2008-r2 nonclustered-index
我的数据库目前在ID每个表的列上都有一个主键/聚集索引。但是,连接到数据库的应用程序始终查看定义为:
SELECT * FROM Table WHERE DeletedDate IS NULL
Run Code Online (Sandbox Code Playgroud)
最好将 the 添加DeletedDate到聚簇索引中,还是将非聚簇索引DeletedDate作为包含的更好的做法?
既然我们说的是聚集索引,仅仅因为你定义了 CI 键列为ID,你仍然拥有DeletedDate索引的叶数据页中的数据。这就是聚集索引的性质:它是表数据。
因为您通常会遇到如下查询:
select *
from YourTable
where DeletedDate is null;
Run Code Online (Sandbox Code Playgroud)
您可能会受益于过滤索引。
create nonclustered index IX_YourFilteredNci
on YourTable(<Key Columns Here>)
where DeletedDate is not null;
go
Run Code Online (Sandbox Code Playgroud)
我没有在此处明确放置键列(以及通过使用INCLUDE子句的非键列),因为您没有发布表的 DDL。
正如我上面对您的问题的评论一样,键列的选择(不仅是列,还有列的顺序)在很大程度上取决于您的工作量和将使用此索引的典型查询。
如果您希望覆盖您的查询,那么您需要确保索引满足查询所需的所有数据。更不用说,如果您有其他WHERE子句(除了NULL检查DeletedDate)或连接要考虑,那么键列的顺序可能是扫描或查找之间的决定因素。即使它被过滤了,并且根据索引中的数据量,损失也可能是相当大的。
| 归档时间: |
|
| 查看次数: |
695 次 |
| 最近记录: |