Я использую Oracle SQL Developer и у меня есть этот запрос, который принимает 5 входных таблиц:
и это занимает бесконечное количество времени. Есть ли что-нибудь, что я могу сделать, чтобы оптимизировать этот запрос?
SELECT DISTINCT
trx.trx_id,
hit4.customer_id,
1 as value_pattern,
hit4.trx_date,
trx.trx_amount,
role,
tiv,
tov,
ratio,
number_hits,
CASE
WHEN segment = 'PK' THEN round((SELECT avg_hits FROM avg_hits_pk))
ELSE round((SELECT avg_hits FROM avg_hits_npk))
END AS avg_hits,
(SELECT param_value FROM params WHERE param_name = 'CSTR') as CSTR,
trx.trx_type
FROM hit4
LEFT JOIN trx
ON hit4.customer_id = trx.customer_id AND hit4.trx_date = trx.trx_date
РЕШЕНО
Я добавил индексы в trx.trx_date и trx.customer_id, удалил отдельные из операторов и отфильтровал таблицу hit4. Выполнение занимает ~7 мин. Спасибо за помощь!
Не ожидайте, что что-либо с DISTINCT и LEFT JOIN в таких таблицах будет быстрым... вам следует начать с анализа ваших данных: сколько строк вы получите, если вы выполните JOIN без DISTINCT? Какова производительность с CASE и SUBSELECT и без них? Кроме того, если trx_id является PK таблицы TRX, как следует из его названия, вам следует проанализировать, не делает ли это DISTINCT бесполезным.
Запрос не имеет условия фильтрации по ведущей таблице hit4
и, следовательно, выбирает всю таблицу (40 миллионов строк). Это обязательно будет медленно. Вы уверены, что вам нужно выбрать ВСЕ строки?
Кроме того, вы должны убедиться, что таблица trx
имеет индекс (customer_id, trx_date)
.
В дополнение к уже данному предложению удалите SUBSELECT и посмотрите, какова производительность.
SELECT
trx.trx_id,
hit4.customer_id,
1 as value_pattern,
hit4.trx_date,
trx.trx_amount,
role,
tiv,
tov,
ratio,
number_hits,
CASE
WHEN segment = 'PK' THEN round(avg_hits_pk.avg_hits)
ELSE round(avg_hits_npk.avg_hits)
END AS avg_hits,
params.param_value as CSTR,
trx.trx_type
FROM hit4,avg_hits_pk,avg_hits_npk,params
LEFT JOIN trx
ON hit4.customer_id = trx.customer_id AND hit4.trx_date = trx.trx_date
where params.param_name='CSTR';
из любопытства насколько улучшились тайминги
Преобразование подзапроса в объединение может немного помочь. Для более подробного ответа нужен план выполнения этого запроса