我应该在子查询(派生表)

时间:2015-12-23 21:59:29

标签: sql sql-server tsql reporting-services

我正在编写一个带有2个派生表的查询(或者你可以称之为子查询)和一个用于过滤器的WHERE子句,但我不知道在哪里放置WHERE子句来优化性能。请看下面的例子: (我当然知道这是一个愚蠢的例子,但它有助于描述我的问题)

SELECT *
FROM
    (SELECT id FROM A) A
    JOIN
    (SELECT id FROM B) B
    ON A.id = B.id
WHERE A.id = 1

VS

SELECT *
FROM
    (SELECT id FROM A
     WHERE A.id = 1
    ) A
    JOIN
    (SELECT id FROM B
     WHERE B.id = 1
    ) B
    ON A.id = B.id

从性能角度来看,放置WHERE子句的位置是否重要? 我的数据库太小了,所以当我测试查询时,我没有看到任何差异。 谢谢。

2 个答案:

答案 0 :(得分:1)

既不能避免呢 在该示例中似乎没有特定需要需要派生的 你做得越复杂,看起来好像查询优化器有更多机会不做最好的事情

这只是一个非常疯狂的查询,但

SELECT A.id 
FROM A 
JOIN B 
      on A.id = B.ID 
     and A.id = 1

SELECT A.id FROM A where A.Id = 1 
intersection 
SELECT B.id FROM B where B.Id = 1 

如果您要进行派生,那么我通常会从派生的IN开始。你可能会遇到的情况是,在复杂的查询中,优化器会变得愚蠢并且会进行一系列循环连接。如果sub变为愚蠢并且做了一堆循环,你甚至可能最终将sub实现为#temp。

答案 1 :(得分:0)

测试过 - 顶层查询在嵌套where之外有select子句,下层查询在嵌套选择中有where子句。该测试用200k行完成。我怀疑性能差异可以忽略不计。

enter image description here

相关问题