#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 в подзапросе.