2014-08-27 14 views
1

У меня есть следующий код:Почему subselect делает SQL-запрос медленнее?

select 
    * 
from 
    table_1 
join 
    table_2 
on 
    table_1.col1 = table_2.col1 
where 
    table_2.col2 = 1 

Этот запрос работает, и дать мне результаты, которые я ожидаю. Теперь я хотел бы оптимизировать этот запрос. Идея заключается в том, что я пытаюсь сократить второй запрос до объединения двух таблиц. Другими словами, я полагаю, что «удаление» строк и объединение небольших таблиц должно быть быстрее, чем объединение больших таблиц, а затем выбор из них того, что мне нужно. Я реализую свою идею следующим образом:

select 
    * 
from 
    table_1 
join 
    (
    select 
     * 
    from 
     table_2 
    where 
     table_2.col2 = 1 
    ) 
on 
    table_1.col1 = table_2.col1 

Удивительно, что второй запрос значительно медленнее первого. Что я делаю не так?

+2

Я бы назвал это очень слабым оптимизатором в Exasol. Разумные базы данных обычно создают один и тот же план выполнения для этих запросов. (Возможно, он построен на MySQL, который будет иметь тот же самый дефект в большинстве версий.) –

ответ

2

Вы можете увидеть разницу в плане выполнения запроса.

Без плана я могу только предположить: В вашем первом примере у вас есть 2 таблицы. Оптимизатор Mysql имеет некоторую статистику данных и может правильно выбирать и использовать индекс.

В вашем втором запросе у вас нет таблицы, только результат запроса и оптимизатор не имеют статистики данных. Возможно, в вашем случае оптимизатор выполнит запрос без индекса или что-то вроде этого.

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

 Смежные вопросы

  • Нет связанных вопросов^_^