【发布时间】:2011-06-22 17:11:06
【问题描述】:
一个旧系统已运抵我们的办公室进行一些更改和修复,但它也存在性能问题。我们不知道这种缓慢的确切原因是什么。
当我们重构旧代码时,我们发现了几个具有以下模式的 sql 查询(为了示例目的,查询被简化):
SELECT
(
SELECT X
FROM A
WHERE A.id = TABLE.id
) AS COLUMN1,
(
SELECT Y
FROM B
WHERE B.id = TABLE.id
) AS COLUMN1,
(
SELECT Z
FROM C
WHERE C.id = TABLE.id
) AS COLUMN1,
...
FROM
TABLE
WHERE
TABLE.id = @param;
这些查询从它们返回的每个列执行多个内部子查询。
我们计划按照以下模式重写这些查询:
SELECT
A.X, B.Y, C.Z
FROM
TABLE
INNER JOIN A on A.ID = TABLE.ID
INNER JOIN B on B.ID = TABLE.ID
INNER JOIN C on C.ID = TABLE.ID
WHERE
TABLE.id = @param;
使用内部连接,它们更易于阅读和理解,但它真的更快吗?这是写它们的更好方法吗? 不幸的是,我们重写的第一个并没有缩短查询时间,反而使查询速度变慢了一些。
这是我的问题:我们应该重写所有这些查询吗?这些子查询是完成这项工作的好方法吗?它们是否比内部连接方式更快?
【问题讨论】:
-
Tom(Kyte,Oracle 出名)在这里对一个非常相似的问题给出了一个很好(而且很简短)的答案:"joins vs subquery , Exists clause "