查询SQL Server大型表的最有效方法几乎完整的结果集
我在SQL Server 2014中有一个包含大量行的表。让我们称之为TableA 我需要查询几乎所有行(比如97%的行)的PK(一个自动增量ID,聚集键),这个结果集通常通过外键(我们称之为FK_A)与另一个表(TableB)连接 查询如下所示:查询SQL Server大型表的最有效方法几乎完整的结果集,sql,sql-server,performance,database-performance,large-data,Sql,Sql Server,Performance,Database Performance,Large Data,我在SQL Server 2014中有一个包含大量行的表。让我们称之为TableA 我需要查询几乎所有行(比如97%的行)的PK(一个自动增量ID,聚集键),这个结果集通常通过外键(我们称之为FK_A)与另一个表(TableB)连接 查询如下所示: SELECT TableB.someColumnNotFKNorPK FROM TableB INNER JOIN TableA ON TableB.FK_A = TableA.ID WHERE Tab
SELECT
TableB.someColumnNotFKNorPK
FROM
TableB
INNER JOIN
TableA ON TableB.FK_A = TableA.ID
WHERE
TableA.LowSparseColumn = 100
问题是TableA
有97%的行LowSparseColumn=100
,因此这会产生行假脱机等,因为SQL Server需要存储部分结果
你知道如何处理这样的问题吗
非常感谢您的帮助
谢谢 如果您在
TableB(fk_A)
(或者更好(TableB(fk_A,someColumnNotFKNorPK)
)上有一个索引,并且您的表统计信息是最新的,那么优化器应该完成它的工作。它应该读取TableA
,并在不进行假脱机的情况下连接到TableB
您可以将查询重写为:
SELECT TableB.someColumnNotFKNorPK
FROM TableB
WHERE EXISTS (SELECT 1
FROM TableA
WHERE TableB.FK_A = TableA.ID AND
TableA.LowSparseColumn = 100
);
这应该最佳地利用
TableA(ID,LowSparseColumn)
上的索引(尽管如果ID
是主键,则不需要该索引).可能是在LowSparseColumn=100
上。我认为过滤索引在这里没有帮助,因为97%的行满足了标准&创建过滤索引的主要考虑之一是相关记录应该是最小的。可能是简单的,LowSparseColumn上的非聚集索引将提高速度。