Gus*_*oso 14 sql oracle select
一个旧系统已经到我们办公室进行一些更改和修复,但它也遇到了性能问题.我们不确切知道这种缓慢的根源是什么.
当我们重构旧代码时,我们发现了几个带有以下模式的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;
Run Code Online (Sandbox Code Playgroud)
这些查询从它们返回的每个列执行几个内部子查询.
我们计划在以下模式上重写这些查询:
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;
Run Code Online (Sandbox Code Playgroud)
使用内部联接,它们更容易阅读和理解,但它真的更快吗?这是写它们的更好方法吗?不幸的是,我们重写的第一个没有改善查询时间,它使查询有点慢.
这是我的问题:我们应该重写所有这些查询吗?这些子查询是否是完成这项工作的好方法?内联方式是否更快?
Rob*_*ijk 15
如果我正确理解了您的问题,那么您正在开始重写某些SQL语句的操作,因为您认为它们可能存在问题.
我的建议是停下来,先开始确定你的时间目前在哪里.只有在您发现它与那些标量子选择的查询中之后,并且由于这些标量子选择,您才应该重写它们.在那之前:开始追踪和检查.
以下是来自OTN的两个线程,用于指导有性能问题的人:
http://forums.oracle.com/forums/thread.jspa?messageID=1812597 http://forums.oracle.com/forums/thread.jspa?threadID=863295
问候,
Rob.
并且:由于标量子查询缓存,您的原始查询可能比使用连接的重写查询快得多.
子查询实际上每行运行一次,而联接发生在索引上.
您已经在问题中提到过,使用联接可以提高可读性和可维护性.