sql-server - 特定列的最佳索引经常用 IS NULL 过滤?

标签 sql-server performance indexing

我有点不确定表中特定列使用的最佳索引。

我有一个 [Deleted] 列,它是一个日期时间,代表记录从系统中“删除”的时刻(这是软删除,因此物理记录本身​​不会被删除)。

几乎所有命中表的查询都会有一个“WHERE [Deleted] IS NULL”过滤器。我并不担心没有此过滤器的查询的性能。

针对这种情况构建的最佳索引是什么?过滤索引 WHERE [Deleted] IS NULL?定义 IsDeleted = Deleted IS NOT NULL 的计算列上的索引我有点不确定。

最佳答案

正如您所说,几乎所有查询都会包含此子句。我建议在表中添加一个 BIT 列,一旦删除一行(软删除),将其设置为 1。同时将此日期时间列保留为 Deleted_Datetime 以跟踪记录何时被删除。

然后在该 BIT 字段上创建一个过滤索引,例如

CREATE NONCLUSTERED INDEX NCIX_Deleted_Data
ON dbo.Table(Deleted)
WHERE Deleted = 0

Bit 是最小的数据类型,对其进行过滤索引将为您带来巨大的性能提升。

您也可以在日期时间列上创建此筛选索引。但逻辑是在这种情况下,sql server 将必须检查索引上的 8 字节数据来查看行是否被过滤。

然而,如果您有位列,则 SQL Server 将必须遍历 1 个字节的数据才能将其过滤掉或保留它。

较小的数据可以快速处理,较大的数据可以有更多的时间来处理它:)。

关于sql-server - 特定列的最佳索引经常用 IS NULL 过滤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26064030/

相关文章:

javascript - 如何减少以下 HTML 5 canvas 游戏的延迟?

sql-server - SQL Server SELECT 语句导致阻塞

java - 使用 weka arff 文件中的标签对数据集进行索引

TIMESTAMP 字段上的 MYSQL 索引不使用索引进行范围查询

不同类型的 MongoDB 索引

sql - 如何通过按位运算符操作执行 SQL JOIN?

sql - 基于累积值的排名

c++ - 优化求和码

mysql - 将相同的变量和值插入到多个表中

php - 无法使用 Golang 连接到 MSSQL 2014(未在 MSSQL 上打开静态端口)