什么是更好的?子查询或内部连接十个表?

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.

并且:由于标量子查询缓存,您的原始查询可能比使用连接的重写查询快得多.

  • 你的回答告诉了我一些我不知道的事情:“标量子查询缓存”。也许子查询有时会很好。但是,我们重写了另一个查询并得到了更好的结果,从 0.5s 到 0.04s。我将您的帖子签名为正确的帖子,因为对于某些人来说,子查询可能确实是一个很好的解决方案。谢谢你。 (2认同)

Sac*_*hag 8

子查询实际上每行运行一次,而联接发生在索引上.

您已经在问题中提到过,使用联接可以提高可读性和可维护性.

  • @ Adam,@ Gustavo - 性能取决于您运行查询的数据库引擎.您必须使用执行计划检查性能(不确定在Oracle中调用它到底是什么).有时子查询更好,有时加入,但最终为了更好的可读性和维护查询,连接有一点点优势. (3认同)