Не найдено

SQL optimization. Join против In и Exists. Что использовать?

Опубликовано: 21.10.2017

«Раньше было проще» — Подумал я, садясь за оптимизацию очередного запроса в SQL management studio. Когда я писал под MySQL, реально все было проще — или работает, или нет. Или тормозит или нет. Explain решал все мои проблемы, больше ничего не требовалось. Сейчас у меня есть мощная среда разработки, отладки и оптимизации запросов и процедур/функций, и все это нагромождение создает по-моему только больше проблем. А все почему? Потому что встроенный оптимизатор запросов — зло. Если в MySQL и PostgreSQL я напишу

select * from a, b, c where a.id = b.id, b.id = c.id

и в каждой из табличек будет хотя бы по 5к строк — все зависнет. И слава богу! Потому что иначе в разработчике, в лучшем случае, вырабатывается ленность писать правильно, а в худшем он вообще не понимает что делает! Ведь этот же запрос в MSSQL пройдет аналогично

select * from a join b on a.id = b.id join c on b.id = c.id

Встроенный оптимизатор причешет быдлозапрос и все будет окей.

Он так же сам решит, что лучше делать — exist или join и еще много чего. И все будет работать максимально оптимально.

Только есть одно НО. В один прекрасный момент оптимизатор споткнется о сложный запрос и спасует, и тогда вы получите большущую проблему. И получите вы ее, возможно, не сразу, а когда вес таблиц достигнет критической массы.

Так вот к сути статьи. exists и in — очень тяжелые операции. Фактически это отдельный подзапрос для каждой  строчки результата. А если еще и присутствует вложенность, то это вообще туши свет. Все будет окей, когда возвращается 1, 10, 50 строк. Вы не почувствуете разницы, а возможно join  будет даже медленнее. Но когда вытаскивается 500 — начнутся проблемы. 500 подзапросов в рамках одного запроса — это серьезно.

IRC (Internet Relay Chat)
  • 12.02.2016
    Как пользоваться IRC

    Общение на форумах кажется Вам слишком долгим, а болтовня в ICQ с единственным собеседником наскучила. Самое время воспользоваться... 
    Читать полностью

  • 12.02.2016
    Пересылка сообщений в IRC-сети

    IRC предоставляет возможность как группового, так и приватного общения. Для группового общения существует несколько возможностей.... 
    Читать полностью

  • 12.02.2016
    IRC-сеть

    Согласно спецификациям протокола, IRC-сеть — это группа серверов, соединённых между собой. Простейшей сетью является одиночный... 
    Читать полностью

  • 12.02.2016
    IRC

    IRC (англ. Internet Relay Chat) — протокол прикладного уровня для обмена сообщениями в режиме реального времени. Разработан в основном... 
    Читать полностью

rss