Могут ли красные смещения сохраненных процедур использоваться для создания диапазона дат UNION ALL - PullRequest
0 голосов
/ 18 июня 2019

Поскольку redshift изначально не поддерживает разделение даты, кроме как в спектре красного смещения, все наши таблицы разделены по датам

my_table_name_YYYY_MM_DD

Так что каждый раз, когда мы выполняем запросы, это обычно выглядит так

select columns, i, want from
(select * from tbl1_date UNION ALL 
select * from tbl2_date UNION ALL 
select * from tbl3_date UNION ALL 
select * from tbl4_date);

Там, где есть один Союз в день.

Могут ли хранимые процедуры генерировать диапазоны дат, чтобы наши бизнес-аналитики перестали терять волосы, когда я отправил им сценарий на python или bash для генерации диапазона дат?

1 Ответ

0 голосов
/ 18 июня 2019

Да, вы можете создать хранимую процедуру, которая генерирует динамический SQL, используя только необходимые таблицы. Смотрите мой ответ здесь, чтобы начать шаблон: Проблема с передачей имени столбца в качестве параметра "ПОДГОТОВИТЬ" в Redshift

Тем не менее, вы должны знать, что Redshift может автоматически достичь большинства из того, что вы хотите, используя представление «Таблица временных рядов». Это задокументировано здесь:

Вы определяете представление, состоящее из UNION ALL, по последовательности идентичных таблиц с ключом сортировки, определенным для обычно фильтруемого столбца даты или отметки времени. Когда вы запрашиваете это представление, Redshift может исключить сканирование любых таблиц UNION, которые не содержат соответствующих данных.

Например:

CREATE OR REPLACE VIEW  store_sales_vw
AS        SELECT * FROM store_sales_1998
UNION ALL SELECT * FROM store_sales_1999
UNION ALL SELECT * FROM store_sales_2001
UNION ALL SELECT * FROM store_sales_2002
UNION ALL SELECT * FROM store_sales_2003
; 

SELECT cd.cd_education_status
      ,COUNT(*) sales_count
      ,AVG(ss_quantity) avg_quantity
FROM store_sales_vw vw
JOIN customer_demographics cd
ON vw.ss_cdemo_sk = cd.cd_demo_sk
WHERE ss_sold_ts BETWEEN '1999-09-01' AND '2000-08-31'
GROUP BY cd.cd_education_status

В этом примере Redshift будет использовать только таблицы store_sales_1999 и store_sales_2000, пропуская другие таблицы в представлении. Обратите внимание, что пропуск таблицы не основан на названии таблицы. Redshift знает значения MIN и MAX временной метки ключа сортировки в каждой таблице.

Если вы используете такой подход, убедитесь, что общий размер UNION достаточно низок. Я рекомендую (самое большее) ежедневные таблицы за последнюю неделю [7], еженедельные таблицы за последний месяц [5], квартальные таблицы за последний год [4], а затем годовые таблицы для более старых данных.

Вы можете использовать ALTER TABLE… APPEND , чтобы объединить ежедневные таблицы в недельные таблицы и так далее.

...