Що швидше LEFT JOIN або підзапит у SELECT, Скахін Олексій

Особистий блог. Нотатки про програмування і не тільки

Що швидше LEFT JOIN або підзапит у SELECT

Часто потрібно вибрати додаткові параметри плюс до основної вибірки. Це можна зробити двома способами:

  • LEFT JOIN до основного запиту
  • Підзапит у секції SELECT
Приклад запиту, який вибирає номенклатуру та товарну групу номенклатури:

Підзапит у секції SELECT:Варіант з LEFT JOIN:Після розбору плану виконання запиту в MS SQL Server, було виявлено:

  • Під час вибірки в секції SELECT потрібен додатковий час на злиття основної вибірки та підзапиту. Вийшло 1% від загального часу. (+ LEFT JOIN/ - SELECT)
  • Виявилось, що кожен LEFT JOIN виконується окремим потоком! У той час, як підзапити виконуються послідовно після основної вибірки. (+ LEFT JOIN/ - SELECT)
  • Кожен LEFT JOIN поєднується в результуючу вибірку, що потребує додаткової пам'яті. Тоді як подзапрос поверне нам одне значення кожний рядок, тобто. Для отримання результату нам потрібно менше пам'яті. (- LEFT JOIN /+ SELECT)
Висновок:В умовах багатоядерних серверівLEFT JOIN має незаперечні переваги

Обмеження у підзапитах:При вибірці додаткових параметрів у секції SELECT ми можемо зіткнутися із ситуацією, коли підзапит повернув нам більше одного запису. Відсікти це можна, вказавши примусово число записів, що вибираються: Такий запит виконувався довше на96%порівняно з аналогічним без TOP 1

Наприкінціхотів би сказати, що бувають ситуації коли без підзапитів не обійтися (угруповання, сортування тощо), але використовувати їх потрібно обґрунтовано, якщо єможливість, то краще скористатися LEFT JOIN.