союз против или - PullRequest
       11

союз против или

0 голосов
/ 23 июня 2010

скажем, у меня есть два запроса:

select top 20 idField, field1, field2 from table1
where idField in
    (
    select idField from table1 where field3 like '...'
    union
    select idField from table2 where field4 like '...'
    )
order by sortfield1

select top 20 idField, field1, field2 from table1
where field3 like '...' 
or idfield in 
(select idField from table2 where field4 like '...')
order by sortfield1

допустим, что обе таблицы довольно большие (table2 больше table1), средний диапазон результатов составляет 0-400, но я всегда хочу получить максимум 20 результатов.

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

Ответы [ 4 ]

1 голос
/ 23 июня 2010

В идеальном мире это не должно иметь значения, но я бы все равно попробовал этот подход.Может быть быстрее:

select top 20 idField, field1, field2 from table1
where idField in
    (
    select top 20 idField from table1 where field3 like '...'
    union
    select top 20 idField from table2 where field4 like '...'
    )
1 голос
/ 23 июня 2010

Проверьте план объяснения, чтобы увидеть, какова эффективность. Это также даст вам представление об индексах, если они в настоящее время не существуют.

1 голос
/ 23 июня 2010

Скорее всего, это зависит от того, какую базу данных вы используете.У меня был неудачный опыт объединения с использованием Oracle (8), он был очень медленным, возможно, потому, что он должен был поместить результаты двух запросов в список в памяти.

Я не уверен, что эти два запроса имеюттот же результат.Второй запрос возвращает значения только из таблицы table1, а первый также возвращает значения из таблицы 2.

0 голосов
/ 23 июня 2010

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

Использование LEFT OUTER JOIN или EXISTS, вероятно, будет быстрее, чем любое из решений в вопросе, которые используют «IN». Но опять же я не могу сказать наверняка без дополнительной информации.

...