【问题标题】:Which of my queries is more efficient?我的哪个查询更有效?
【发布时间】:2013-07-18 05:46:10
【问题描述】:

以下哪一项查询效率更高,为什么?根据执行计划,它们的总成本相同,但我不确定仅此一项是否能很好地衡量整体性能。

1>

SELECT MIN(ROWID), MAX(ROWID)
FROM tab_a
WHERE status = 0
AND EXISTS (
    SELECT 'X'
    FROM tab_b
    WHERE status = 0
    AND number = assembly_number
    AND ROWID >= :min_rowid
    AND ROWID <= :max_rowid
)
;

2>

SELECT MIN(ROWID), MAX(ROWID)
FROM tab_a
WHERE status = 0
AND assembly_number IN (
    SELECT number
    FROM tab_b
    WHERE status = 0
    AND ROWID >= :min_rowid
    AND ROWID <= :max_rowid
)
;

【问题讨论】:

  • 这在很大程度上取决于表上的索引。
  • @astander:真的吗?有人会认为查询规划器将它们视为等价的(这似乎是因为它显示相同的成本)。
  • 你能显示两者的执行计划吗? (看起来它们可能是相同的)。
  • 如果查询优化器将两者优化到同一个查询中,我不会感到惊讶。

标签: sql oracle11g


【解决方案1】:

如果 assembly_number 被索引,那么下面的查询会更好。

SELECT MIN(ROWID), MAX(ROWID)
FROM tab_a
WHERE status = 0
AND EXISTS (
    SELECT 'X'
    FROM tab_b
    WHERE status = 0
    AND number = assembly_number
    AND ROWID >= :min_rowid
    AND ROWID <= :max_rowid
);

【讨论】:

  • 你怎么知道的? Oracle 的优化器非常聪明,如果两个查询的执行计划完全相同,我不会感到惊讶。
  • 我在status + number 上添加了索引。与上一个计划相比,成本有所降低。但是,对于 1 和 2 查询,我仍然获得相同的成本计划。根据asktom.oracle.com/pls/asktom/…,选择简单取决于内部或外部哪个查询有更多数据。就我而言,两者的数量相同。
猜你喜欢
  • 2012-02-25
  • 1970-01-01
  • 2012-07-11
  • 2011-03-09
  • 1970-01-01
  • 2011-05-23
  • 2015-03-14
  • 2015-01-24
  • 2013-03-30
相关资源
最近更新 更多