sql-server - 在日期列中使用 NULL 时,多索引的 SQL Server 统计信息不正确
问题描述
SQL Server 有一个关于索引的统计信息,它错误地估计了行数,这个表(和谓词)用于许多不同的查询。这会导致这些查询执行不佳,因为统计数据期望查询返回 5 行,而它返回 431268。
查询:
SELECT COUNT(BuildRecord.BuildRecordID)
FROM dbo.BuildRecord
WHERE BuildRecord.ContainedToDT IS NULL
AND BuildRecord.RfBuildRecordTypeID = 2
AND BuildRecord.IsEdited = 0
昨天用 FULLSCAN 更新了统计数据:
索引的碎片<1%。
在BuildRecord
表中,ContainedToDT
是 NULLABLE DATETIMEOFFSET
,RfBuildRecordTypeID
是 NOT-NULLSMALLINT
并且IsEdited
是 NOT-NULL TINYINT
。
指数如下:
CREATE NONCLUSTERED INDEX [IM_ContainedToDT_RfBuildRecordTypeID_IsEdited]
ON [dbo].[BuildRecord] ([ContainedToDT] ASC, [RfBuildRecordTypeID] ASC, [IsEdited] ASC)
INCLUDE([InvPackCreatedID], [InvPackConsumedID])
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
SQL Server 版本为 Microsoft SQL Server 2019 (RTM-CU8) (KB4577194) 兼容模式为 SQL Server 2016 (130)
任何建议或想法将不胜感激。
解决方案
推荐阅读
- r - R中的列表:实际发生了什么?
- wordpress - 无法使用 WP CLI 安装插件
- javascript - PHP 可以读取第 3 方 URL,而 Javascript 则不能。为什么?
- r - ggplot 中的响应式注释 - 用变化的形状和文本注释图形
- javascript - 改变正在发生的盒子的速度(DOM“改变”事件相关)
- python - 使用 pip 安装 javabridge 的编译器错误
- neural-network - Keras C3DNN 预测结果相同
- javascript - Chart.js:获取隐藏数据集
- c++ - 使用 jsoncpp NuGet 包时获取未解析的外部符号
- php - MYSQL LONGTEXT 字段在检索时被截断