查询SQL Server大型表的最有效方法几乎完整的结果集

查询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

我在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  
    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上的非聚集索引将提高速度。