sql - SQL Server 过滤索引“估计要读取的行数”是全表的大小
问题描述
我在 Azure SQL 数据库中有一个大约 200 万行的表。在这张表上,我有两对要过滤为空的列 - 所以我过滤了每对的索引,检查每一列的空值。
其中一个索引的大小似乎大约是另一个索引的两倍——(~400,000 对~800,000 行)。
然而,查询似乎需要大约 10 倍的时间。
我在两者上运行完全相同的查询:
SELECT DomainObjectId
FROM DomainObjects
INNER JOIN
(SELECT <id1> AS Id
UNION ALL
SELECT<id2> etc...
) AS DomainObjectIds ON DomainObjectIds = DonorIds.Id
WHERE C_1 IS NULL
AND C_2 IS NULL
其中 C_1/C_2 是具有过滤索引的列(并在我的其他查询中被其他列替换)。
查询计划都涉及索引搜索 - 但在快速计划中,它占运行时的 99%。在缓慢的情况下,它只有 50% - 另一半用于过滤(这似乎很可疑,因为过滤应该从过滤的索引中隐含),然后加入查询的 ID。
此外,索引查找的“估计要读取的行数”约为 200 万,即整个表的大小。基于此,它看起来像我期望的全表扫描的样子。我检查了索引大小,“慢”的只占用“快”的两倍空间,这意味着它不仅仅是生成不良。
我不明白:
- (a) 为什么要花这么多时间从索引中重新应用过滤器
- (b) 为什么“慢”索引的估计行数如此之高
- (c) 考虑到过滤索引的相似性,是什么导致这两个查询的速度如此不同。我希望慢的会慢两倍,这完全取决于与每个过滤器匹配的行数。
解决方案
推荐阅读
- css - 我如何隐藏从身体溢出的一切?
- python - 暂停 for 循环以等待按钮按下
- dart - 列表添加地图对象
- swiftui - SwiftUI 2 中的 Big Sur 风格侧边栏 Mac Catalyst
- c# - 了解批量插入的 SQL Server 合并问题
- python - 乘以长度为 1 的熊猫系列时出现键错误“0”
- javascript - 在 React 中使用多个异步事件处理状态的策略
- ffmpeg - 将 .mp4 转换为 .mkv 会改变数据保真度吗?
- c# - Unity3D c# 2D Game Camera Follow 正在跳跃
- .net-core - Aspnet Core 3.1 MVC Razor 页面在使用 Identity Server 4 OpenIdConnect 进行身份验证后得到 302