Я работаю над улучшением производительности для запроса и обнаружил странную ситуацию.
Запрос выглядит как
SELECT
some_columns_and_conditions,
SUM(val_1/100) as "val_1",
SUM(val_2/100) as "val_2",
SUM(val_3/100) as "val_3",
SUM(val_4/100) as "val_4",
SUM(val_5/100) as "val_5"
FROM
tab_1 tb1
INNER JOIN
tab_2 tb2 ON (tb1.col = tb2.col)
INNER JOIN
(SELECT few_cols
FROM tab_3
WHERE ... ) tb3 ON (tb2.id = tb3.id)
few_more_inner_joins
WHERE
<filterings>
GROUP BY
some_columns_and_conditions
ORDER BY
columns
Это работает и занимает около 15 минут.
Запрос работает с 4 таблицами:
- 2 из них маленькие
- 1 таблица имеет 20M записей, запрос извлекает около 10k
- последние запросы имеют 40M записей и возвращают около 3-4M строк
Запрос выдает около 3-4 строк.
Я пытался переписать это с временной таблицей. Первая попытка уменьшить время выполнения в 2 раза:
drop table #tmp
select ...
into #tmp
from ...
select * from #tmp
К сожалению, для меня это неприемлемо. Мне нужно достичь аналогичного результата с запросом.
Можете ли вы помочь мне с некоторыми вопросами:
- Почему это улучшило производительность в 2 раза?
- Как я могу достичь того же с помощью одного запроса?