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%-另一半花费了 filtering (似乎值得怀疑,因为应该从过滤的索引中隐含过滤条件),然后再加入查询的ID。 / p>

此外,索引查找的“要读取的估计行数”约为200万,即整个表的大小。基于此,看起来像我期望的全表扫描一样。我检查了索引的大小,“慢速”索引只占用了“快速”索引的两倍,这意味着它不仅生成不好。

我不明白:

  • (a)为什么花这么多时间从索引重新应用过滤器
  • (b)为什么“慢”索引的估计行数如此之高
  • (c)考虑到过滤后的索引的相似性,可能导致这两个查询的速度如此不同的原因。纯粹基于与每个过滤器匹配的行数,我希望速度较慢的速度要慢两倍。

Fast Index

enter image description here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)