问题描述
我在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%-另一半花费了 filtering (似乎值得怀疑,因为应该从过滤的索引中隐含过滤条件),然后再加入查询的ID。 / p>
此外,索引查找的“要读取的估计行数”约为200万,即整个表的大小。基于此,看起来像我期望的全表扫描一样。我检查了索引的大小,“慢速”索引只占用了“快速”索引的两倍,这意味着它不仅生成不好。
我不明白:
- (a)为什么花这么多时间从索引重新应用过滤器
- (b)为什么“慢”索引的估计行数如此之高
- (c)考虑到过滤后的索引的相似性,可能导致这两个查询的速度如此不同的原因。纯粹基于与每个过滤器匹配的行数,我希望速度较慢的速度要慢两倍。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)