Какой из этих запросов более эффективен? - PullRequest
0 голосов
/ 28 мая 2010

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

select 1 as newAndClosed
    from sysibm.sysdummy1
    where exists (
        select 1 
            from items 
            where new = 1
        ) 
        and not exists (
            select 1 
                from status 
                where open = 1
        )


select 1 as newAndClosed
    from items
    where new = 1 
        and not exists (
            select 1 
                from status 
                where open = 1
        )

Ответы [ 5 ]

1 голос
/ 28 мая 2010

Посмотрите на план объяснения и / или вывод профилировщика. Кроме того, измерить это. Измерьте его, используя переменные связывания и повторные прогоны.

0 голосов
/ 28 мая 2010

Они будут давать разные результаты, если items содержит более одного элемента с new = 1. exists будет проверять только первую запись, которая соответствует условию. Поэтому я бы проголосовал за первый вариант, если в реальном запросе у вас нет отношения между items и status (как в вашем примере).

P.S. Обычно я использую SELECT 1 WHERE 2==2, когда мне нужен только один результат из ниоткуда. Если мне нужно больше SELECT 1 UNION SELECT 2.

0 голосов
/ 28 мая 2010

С упрощенной точки зрения я бы ожидал, что запрос 2 будет выполняться быстрее, потому что он включает меньше запросов, но, как указывает Хэнк, запуск его через Profiler - лучший способ убедиться в этом.

0 голосов
/ 28 мая 2010

Я думаю, что второй быстрее, потому что, в отличие от первого, таблица sysibm.sysdummy1 не нуждается в анализе

0 голосов
/ 28 мая 2010

Я бы лично сказал второй запрос.

Сначала он запрашивает таблицу Items напрямую и фильтрует с помощью предложения WHERE в поле этой таблицы.

Во-вторых, он использует только один другой подзапрос вместо двух.

В конце второй пример завершает выполнение только двух запросов, тогда как первый пример выполняет три.

Многие запросы всегда будут обходиться дороже, чем меньшее количество запросов для управления ядром базы данных. За исключением случаев, когда вы выполняете EXISTS проверки вместо соединений таблицы. Соединение дороже, чем предложение EXISTS .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...