我正在编写一个带有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子句的位置是否重要? 我的数据库太小了,所以当我测试查询时,我没有看到任何差异。 谢谢。
答案 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)