2017-05-14 26 views
1

我有一个SQL Server 2014中有大量行的表。我们称之为TableA。最有效的方式来查询SQL Server大表几乎完整的结果集

我需要查询其PK(自动增量ID,聚集键)为几乎所有行(比方说,该行的97%),且该结果集通常是在通过另一个表(表B)加入外键(我们称之为FK_A)。

查询看起来像:

SELECT 
    TableB.someColumnNotFKNorPK 
FROM 
    TableB 
INNER JOIN 
    TableA ON TableB.FK_A = TableA.ID 
WHERE 
    TableA.LowSparseColumn = 100 

的问题是,TableALowSparseColumn = 100行的97%,因此这个产量,因为SQL Server需要藏匿的部分结果

来排线轴等。

你知道如何处理这样的问题吗?

任何帮助真的很感激!

谢谢!

+1

可能是由于[LowSparseColumn = 100]上的[创建过滤索引](https://docs.microsoft.com/zh-cn/sql/relational-databases/indexes/create-filtered-indexes)。 –

+0

我不认为如此过滤的索引将在这里帮助,因为97%的行满足该标准,创建过滤索引的主要考虑因素之一应该是相关记录应该是最小的。 LowSparseColumn上的简单非聚集索引可能会提高速度。 –

回答

2

如果您有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是主键)