У меня есть 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 * записей.
Пожалуйста, сообщите.
Спасибо