我在SQL Server 2014中有一个包含大量行的表。我们称之为TableA。
我需要查询其PK(一个AUTOINCREMENT ID,CLUSTERED KEY)几乎所有行(比方说,97%的行),这个结果集通常与另一个表连接(表B)通过外键(让我们称之为FK_A)。
查询如下:
SELECT
TableB.someColumnNotFKNorPK
FROM
TableB
INNER JOIN
TableA ON TableB.FK_A = TableA.ID
WHERE
TableA.LowSparseColumn = 100
问题是TableA
有97%的行带有LowSparseColumn = 100
,因此这会产生行假脱机等因为SQL Server需要存储部分结果
你知道如何处理这个问题吗?
非常感谢任何帮助!
谢谢!
答案 0 :(得分:2)
如果您有TableB(fk_A)
的索引(或者更好(TableB(fk_A, someColumnNotFKNorPK)
并且您的表统计信息是最新的),那么优化程序应该完成它的工作。它应该是{{1}并且在没有假脱机的情况下加入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)
是主键,则不需要该索引)。