Больше нет места в буфере для запроса в Teradata - PullRequest
0 голосов
/ 07 февраля 2020

Я использую базу данных Teradata, но я довольно плохо знаком с ее функционированием. Не могли бы вы помочь мне сделать приведенный ниже запрос более эффективным, чтобы он не выдавал ошибку «больше нет места в буфере»? Он становится слишком тяжелым после добавления второго соединения.

SELECT
  a.src_cmpgn_code,
  a.cmc_name,
  SUM(b.open_cnt)
FROM access_views.dw_cmc_lkp a
LEFT JOIN prs_restricted_v.mh_crm_engmnt_sd b
  ON b.cmpgn_id = a.cmc_id
LEFT JOIN access_views.dw_cmc_instnc c
  ON b.cmpgn_id = c.cmc_id
WHERE 1=1
  AND b.trigger_dt BETWEEN '2019-01-01' AND '2019-12-31'
  AND b.site_cntry_id = 1
  AND a.cmpgn_group_name IN ('a', 'b', 'c', 'd')
  AND c.dlvry_vhcl_id IN (1, 10)
  AND c.chnl_id = 1
GROUP BY 1,2;

Объяснение выглядит следующим образом:

Этот запрос оптимизирован с использованием профиля типа 2 Cost_NoSlidingJ_Profile, profileid 10007. 1) Во-первых, мы блокируем mdm_tables.DW_CMC_INSTN C с точки зрения access_views.dw_cmc_instn c для доступа, мы блокируем MDM_TABLES.DW_CMC_LKP с точки зрения access_views.dw_cmc_lkp для доступа и блокируем PRS_T.M. 2) Затем мы выполняем шаг восстановления всех AMP из 365 разделов PRS_T.MH_CRM_ENGMNT_SD в представлении prs_restricted_v.mh_crm_engmnt_sd с условием ("(NOT (PRS_T.MH_CRM_EN (IS) .NG_ND_MD_MD). (PRS_T.MH_CRM_ENGMNT_SD в представлении prs_restricted_v.mh_crm_engmnt_sd.TRIGGER_DT <= ДАТА '2019-12-31') И (PRS_T.MH_CRM_ENGMNT_SD.TRIGGER_DT_RG_RT_RT_RT) mh_crm_engmnt_sd.SITE_CNTRY_ID = 1. Размер буфера 4 оценивается без уверенности в 329 656 959 строк (7 582 110 057 байт). Расчетное время для этого шага составляет 2,40 секунды. 3) Мы выполняем шаг СОЕДИНЕНИЯ со всеми AMP из MDM_TABLES.DW_CMC_LKP в представлении access_views.dw_cmc_lkp путем сканирования всех строк с условием («MDM_TABLES.DW_CMC_LKP в представлении access_views.dw_cmc_lkp.UP_NG_NG_NG_NB») DailyDeal ',' Other ',' STEP_User_Agreement ') "), который присоединяется к Spool 4 (Последнее использование) путем сканирования всех строк. MDM_TABLES.DW_CMC_LKP и Буфер 4 объединяются с использованием одного раздела, имеющего sh соединение, с условием соединения ("CMPGN_ID = MDM_TABLES.DW_CMC_LKP.CMC_ID"). В результате получается Spool 5 (all_amps), разделенный на 5 га sh соединительных перегородок, который локально построен на AMP. Размер Spool 5 оценивается без уверенности в 79,119,821 строк (10,681,175,835 байт). Расчетное время для этого шага составляет 0,19 секунды. 4) Мы выполняем шаг восстановления всех AMP из mdm_tables.DW_CMC_INSTN C в представлении access_views.dw_cmc_instn c посредством сканирования всех строк с условием ("(mdm_tables.DW_CMC_INSTN C в представлении доступа_). dw_cmc_instn c .DLVRY_VHCL_ID IN (1, 10)) И (((mdm_tables.DW_CMC_INSTN C в представлении access_views.dw_cmc_instn c .CHNL_ID = 1) И (mdm_tables.DW_N_10_10_10_10_10_10_C_C_C_C_W_C_W_C_W_C_C_C_W_C_W_C_C_W_C_C_W_C_C_W_C_C_C_W_C_C_W_C_W_C_W_C_C_W_N_N_C_C_C_W_C_W_N_C_C_W_C_D_W_N_W_N_C_C_C_WD_W_N_C_C_C_WD_W_N_W_C_C_C_C_C_W_C_W_C_C_C_WD * .TRTMNT_TYPE_CODE <> 'I')) ") в Spool 6 (all_amps) разветвляется на объединяемые 5 га sh разделы, которые перераспределяются с помощью кода ha sh (mdm_tables.DW_CMC_INSTN C .CMC_ID) для всех AMP. Размер Spool 6 оценивается без уверенности в 2 874 675 строк (48 869 475 байт). Расчетное время для этого шага составляет 0,58 секунды. 5) Мы выполняем шаг СОЕДИНЕНИЯ со всеми AMP из Spool 5 (Последнее использование) путем сканирования всех строк, который присоединяется к Spool 6 (Last Use) посредством сканирования всех строк. Буфер 5 и Буфер 6 объединяются с использованием хэш-соединения из 5 разделов с условием соединения ("(CMPGN_ID = CMC_ID) AND (CMC_ID = CMC_ID)"). Результат попадает в Spool 3 (all_amps), который локально построен на AMP. Размер буфера 3 оценивается без уверенности в 5 353 507 625 строк (690 602 483 625 байт). Расчетное время для этого шага составляет 14,82 секунды. 6) Мы выполняем шаг SUM из всех AMP для агрегирования из буфера 3 (последнее использование) путем сканирования всех строк с группировкой по полю1 (MDM_TABLES.DW_CMC_LKP.SRC_CMPGN_CODE, MDM_TABLES.DW_CMC_LKP.CMC_NAME). Совокупные промежуточные результаты вычисляются глобально, а затем помещаются в буфер 7. Размер буфера 7 оценивается без уверенности в 11 774 строки (5 286 526 байт). Расчетное время для этого шага 24,51 секунды. 7) Мы делаем шаг извлечения всех AMP из Spool 7 (Последнее использование) путем сканирования всех строк в Spool 1 (group_amps), который локально построен на AMP. Размер буфера 1 оценивается без уверенности в 11 774 строки (2 837 534 байта). Расчетное время для этого шага составляет 0,01 секунды. 8) Наконец, мы отправляем шаг END TRANSACTION всем AMP, участвующим в обработке запроса. -> Содержимое буфера 1 отправляется обратно пользователю в результате оператора 1. Общее расчетное время составляет 42,50 секунды.

...