лучший способ упорядочить объединенный выбор

#sql #sql-server #database #performance #join

#sql #sql-сервер #База данных #Производительность #Присоединиться

Вопрос:

У меня есть основная таблица, с которой я соединяю несколько таблиц, используя внешние ключи (обычно они состоят только из ключа строки). Я сортирую их по метке времени (расположенной в основной таблице) и запрашиваю первые n записей.
В настоящее время я делаю все это в одной команде выбора.
Эффективнее ли сначала выполнить команду выбора с order by помощью and top (n) , а затем присоединиться к ним?
Итак, я делаю это сейчас с двумя выборками

 SELECT t0.keycol, t0.timestamp, t0.id_1, t0.id_2,
    t1.keycol, t1.timestamp, t1.id_3, t2.id_3,
    t2.value_1, t3.id_1, t3.value_1, t4.id_2,
    t4.value_2, t5.keycol, t5.timestamp, t5.id_1, t5.id_2
FROM (
SELECT t.keycol, t.timestamp, t.id_1, t.id_2
    FROM tbl_1 AS t
    ORDER BY t.timestamp DESC
    OFFSET 0 ROWS FETCH NEXT 20 ROWS ONLY
) AS t0
    INNER JOIN tbl_2 AS t1 ON t0.keycol = t1.keycol
    INNER JOIN tbl_3 AS t2 ON t1.Id_3 = t2.id_3
    INNER JOIN tbl_4 AS t3 ON t0.id_1 = t3.id_1
    INNER JOIN tbl_5 AS t4 ON t0.id_2 = t4.id_2
    LEFT JOIN tbl_6 AS t5 ON t1.keycol = t5.keycol

ORDER BY t0.timestamp DESC, t0.keycol, t1.keycol,
 t2.id_3, t3.id_1, t4.id_2, t5.keycol, t5.timestamp
  

Комментарии:

1. Доверяйте оптимизатору, делайте все сразу.

2. можете ли вы опубликовать какой-нибудь запрос / код для справки? это было бы полезно.

3. Иногда материализация части запроса может повысить производительность, особенно при работе с большими или сложными данными … вы это тестировали? Вы можете использовать SET IO STATISTICS, чтобы оценить, какие чтения он выполняет в каждом конкретном случае. И / или повторно запустите обе версии и посмотрите, какая из них лучше. Если разницы нет, придерживайтесь более простого оператора single.

4. Не пытайтесь решить проблему, которой у вас нет.

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