1

UPDATE

我认为现在还不成熟。经过多次测试后,我发现性能没有提高。我将在这里执行更多的测试并发布更新。直到那时,不用回答这个问题。SQL查询UNION性能

我有这样的查询...

SELECT DISTINCT TOP 11 [Field_A] 
FROM [#TempTable] 
WHERE [Field_A] NOT IN (SELECT bo.[Id] 
         FROM [BusinessObject_Table] bo 
         UNION 
         SELECT boTemp.[Id] 
         FROM [#BusinessObject_Table] boTemp) 

该查询永远需要一个相当大的数据集上运行。我还在临时表的Id列中添加了CLUSTERED索引,这可以提高性能,但仍然无法完成。

我代替此查询这... ...

SELECT DISTINCT TOP 11 [Field_A] 
FROM [#TempTable] 
WHERE [Field_A] NOT IN (SELECT bo.[Id] 
         FROM [BusinessObject_Table] bo) 
     AND [Field_A] NOT IN (SELECT boTemp.[Id] 
          FROM [#BusinessObject_Table] boTemp) 

这秒内完成。有人能解释这里发生了什么吗?

更新: 我以为两个查询都是一样的。这是我需要的。

BusinessObject_Table has following Ids: 1, 2, 3

#BusinessObject_Table has: 3, 4, 5

TempTable has rows whose Field_A values are: 1, 2, 3, 4, 6

查询的结果应该是:6(在上面的查询其变化)

我将努力让查询计划和岗位他们在这里。

+1

请张贴计划。无论如何,查询都会做不同的事情。第二个检查它没有出现在两个表中。第一张桌子。第一个需要使用'intersect'或第二个'或'是相同的。 – 2012-03-27 09:22:52

回答

3

猜不透在没有查询计划...

的UNION子查询强制DISTINCT。使用单独的IN子句,这是可以避免的。然而,逻辑是查询之间的不同(编辑:马丁·史密斯指出)

随着UNION ALL和一个它应该会更好,如果是这样的逻辑,你想

WHERE [Field_A] NOT IN (SELECT bo.[Id] 
        FROM [BusinessObject_Table] bo 
        UNION ALL 
        SELECT boTemp.[Id] 
        FROM [#BusinessObject_Table] boTemp) 
2

我认为你应该做的您的查询以这种方式:

SELECT DISTINCT TOP 11 [Field_A] 
FROM [#TempTable] 
WHERE NOT EXISTS(
    SELECT 1 FROM BusinessObject_Table bo WHERE #TempTable.FieldA = bo.Id 
) AND NOT EXISTS(
    SELECT 1 FROM #BusinessObject_Table bo WHERE #TempTable.FieldA = bo.Id 
) 

这样SQL Server可以使用它的优化器可能比UNIONed查询好一点。根据索引策略和表大小,优化器可能会选择以不同顺序运行查询。这很可能是最快的方式。虽然没有表格结构和索引以及执行计划,但很难确定。

+0

谢谢你。现在查询速度很快。我将对此进行测试,并在稍后发布更多评论(以及执行计划) – Zuber 2012-03-27 11:55:24