sql разрешение союза - PullRequest
       1

sql разрешение союза

4 голосов
/ 14 марта 2012

скажем, у нас есть следующий SQL:

select * from (
    select Id from table1
    union all
    select id from table2
    union all
    select id from table3
) as X where Id in (1,2,3)

Достаточно ли умен оптимизатор SQL, чтобы применить "where id in (1,2,3)" к каждой таблице перед объединением? Можем ли мы сделать предположение о других поставщиках БД, таких как Oracle, по этому поводу? Предположения всегда опасны, но я все равно подумал.

Ответы [ 2 ]

4 голосов
/ 14 марта 2012

Попробуйте выполнить этот запрос в SQL Server Management Studio с включенным включением фактического плана выполнения. Посмотрите, выполняет ли внутренний выбор поиск по этим ключам.

Я настроил тестовый пример с 3 таблицами, у которых в качестве кластерного первичного ключа был указан идентификатор. План выполнения действительно показывает поиск кластеризованного индекса по трем выбранным идентификаторам.

Однако, если вы действительно хотите быть уверены, что внутренние запросы оптимизируют свои планы таким образом, вы можете поместить предложение WHERE в каждый подзапрос. Например:

select * from
(
    select Id from table1 where Id in (1,2,3)
    union all
    select id from table2 where Id in (1,2,3)
    union all
    select id from table3 where Id in (1,2,3)
) as X

Также обратите внимание, что вышеприведенный union all потенциально вернет дубликаты, если более одной из таблиц имеют совпадающий Id. Если это проблема, вы можете изменить union all на union следующим образом.

select * from
(
    select Id from table1 where Id in (1,2,3)
    union
    select id from table2 where Id in (1,2,3)
    union
    select id from table3 where Id in (1,2,3)
) as X

Я не могу гарантировать такое поведение в других системах БД, но я был бы удивлен, если бы их оптимизаторы запросов не делали то же самое.

0 голосов
/ 14 марта 2012

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

На этом сайте обсуждается объяснение плана, которое вам следует знать, если вы пытаетесь оптимизировать запросы.

http://www.simple -talk.com / SQL / производительность / выполнение-план-основы /

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