首页 > 解决方案 > 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 万,即整个表的大小。基于此,它看起来像我期望的全表扫描的样子。我检查了索引大小,“慢”的只占用“快”的两倍空间,这意味着它不仅仅是生成不良。

我不明白:

快速索引

在此处输入图像描述

标签: sqlsql-serverazure-sql-databasesql-execution-plan

解决方案


推荐阅读