Улучшение производительности Join in Query - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть sql (ниже), где мы должны сравнить некоторые поля в основной таблице с существующей таблицей измерения даты и отфильтровать записи, которые имеют purchase_date так же, как в последний день предыдущего месяца.

Таким образом, идея состояла в том, чтобы прикрепить требуемый date из date-dim к каждой записи набора соединений, содержащей purchase_date, а затем сравнить обе эти даты и фильтр. Следовательно, я сделал cross-join для достижения этой цели.

Вариант 1:

create temporary view date_dim_sub as
select
    dt,
    fst_day_of_mth,
    lst_day_of_mth
from date_dim_tbl
where dt = add_months(${input_date}, -1);

create temporary view cust_main as
select
    c.cust_nm,
    c.cust_id,
    c.purch_date
from customer c
cross join date_dim_sub d
where c.purch_date = d.lst_day_of_mth;

Однако, когда я пытаюсь запустить вышеуказанные sqls, это занимает необычно много времени для выполнения и частозависает, заставляя нас убить процесс.

Я думал об использовании подзапроса (как показано ниже) для date_dim, но я где-то читал, что подзапросы не рекомендуются, потому что подзапросы оцениваются для каждой строки во внешнем наборе результатовчто приводит к снижению производительности.

Вариант 2 (с использованием подзапроса):

create temporary view cust_main as
select
    c.cust_nm,
    c.cust_id,
    c.purch_date
from customer c
where c.purch_date <> (select lst_day_of_mth from date_dim_sub where dt = add_months(${input_date}, -1));

Есть ли способ переписать запросы, которые повысят производительность и уменьшат любую вероятность зависания запроса? Мы используем Spark-SQL. В основной таблице приблизительно 1021 * записей.

Пожалуйста, сообщите.

Спасибо

...