Оптимизация соединения SQL (от 40 до 240 миллионов строк) и запроса операторов case

Я использую Oracle SQL Developer и у меня есть этот запрос, который принимает 5 входных таблиц:

  • таблица hit4 с 40 миллионами строк (используется в операторе соединения)
  • таблица trx с 240 миллионами строк (используется в операторе соединения)
  • Таблица avg_hits_pk с 1 значением с плавающей запятой (используется в операторе case)
  • Таблица avg_hits_npk с 1 значением с плавающей запятой (используется в операторе case)
  • params, представляющая собой таблицу из 10 строк с параметрами (используется в качестве оператора select)

и это занимает бесконечное количество времени. Есть ли что-нибудь, что я могу сделать, чтобы оптимизировать этот запрос?

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 мин. Спасибо за помощь!

Преобразование подзапроса в объединение может немного помочь. Для более подробного ответа нужен план выполнения этого запроса

ekochergin 23.11.2022 13:07

Не ожидайте, что что-либо с DISTINCT и LEFT JOIN в таких таблицах будет быстрым... вам следует начать с анализа ваших данных: сколько строк вы получите, если вы выполните JOIN без DISTINCT? Какова производительность с CASE и SUBSELECT и без них? Кроме того, если trx_id является PK таблицы TRX, как следует из его названия, вам следует проанализировать, не делает ли это DISTINCT бесполезным.

p3consulting 23.11.2022 14:08

Запрос не имеет условия фильтрации по ведущей таблице hit4 и, следовательно, выбирает всю таблицу (40 миллионов строк). Это обязательно будет медленно. Вы уверены, что вам нужно выбрать ВСЕ строки?

The Impaler 23.11.2022 15:37

Кроме того, вы должны убедиться, что таблица trx имеет индекс (customer_id, trx_date).

The Impaler 23.11.2022 15:38
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В дополнение к уже данному предложению удалите 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';

из любопытства насколько улучшились тайминги

psaraj12 01.12.2022 18:41

Другие вопросы по теме