Какой из моих запросов более эффективен?

Какой из следующих запросов более эффективен и почему? В соответствии с планом выполнения они оба имеют одинаковую общую стоимость, но я не уверен, что это само по себе является хорошим показателем общей производительности.

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
)
;

person AppleGrew    schedule 18.07.2013    source источник
comment
Это будет сильно зависеть от индексации таблиц.   -  person Adriaan Stander    schedule 18.07.2013
comment
@astander: Правда? Можно было бы подумать, что планировщик запросов рассматривает их как эквивалентные (что, похоже, так и есть, поскольку он показывает одинаковую стоимость).   -  person Thilo    schedule 18.07.2013
comment
Можете ли вы показать планы выполнения для обоих? (Похоже, они могут быть идентичными).   -  person Thilo    schedule 18.07.2013
comment
если номер_сборки проиндексирован, то, возможно, номер 2 более эффективен   -  person Francis Fuerte    schedule 18.07.2013
comment
@AppleGrew взгляните на asktom. oracle.com/pls/asktom/   -  person Adriaan Stander    schedule 18.07.2013
comment
первое, что я посмотрел на синтаксис, это оба были разные.. но кто-то отредактировал его, и он стал идентичным.. как мы можем знать сейчас наверняка -_-   -  person Francis Fuerte    schedule 18.07.2013
comment
Я не удивлюсь, если оптимизатор запросов оптимизирует оба в один и тот же запрос.   -  person GolezTrol    schedule 18.07.2013
comment
Сравните планы выполнения.   -  person a_horse_with_no_name    schedule 18.07.2013


Ответы (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
);
person Shaikh Farooque    schedule 18.07.2013
comment
Откуда ты это знаешь? Оптимизатор Oracle довольно умен, и я не удивлюсь, если оба запроса приведут к одному и тому же плану выполнения. - person a_horse_with_no_name; 18.07.2013
comment
Хорошо, я добавил индекс на status + number. Стоимость снижена по сравнению с предыдущим планом. Тем не менее, я получаю одинаковые тарифные планы для запросов 1 и 2. Согласно asktom.oracle.com/ pls/asktom/ выбор зависит от того, внутренний или внешний запрос содержит больше данных. В моем случае оба имеют одинаковую сумму. - person AppleGrew; 19.07.2013