настройка производительности запроса снежинки - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть запрос снежинки с несколькими ctes и вставка в таблицу с помощью задания Talend. Выполнение запроса занимает более 90 минут. Это несколько каскадных ctes, один вызывает другой, а другой вызывает другой.

Я хочу улучшить производительность запроса. Это как 1000 строк кода, и я не могу вставить его здесь. Когда я проверил профиль, и он показывает все оконные и агрегатные функции, что замедляет запрос.

Например, верхняя медленнее,

ROW_NUMBER​(​​)​ OVER ​(​PARTITION BY LOWER​(​S​.​SUBSCRIPTIONID​)​ 
                   ORDER BY S​.​ISROWCURRENT DESC NULLS FIRST, 
                      TO_NUMBER​(​S​.​STARTDATE​)​ DESC NULLS FIRST, 
                      IFF​(​S​.​ENDDATE IS NULL, '29991231', S​.​ENDDATE​)​ DESC NULLS FIRST​)​ 

занимает 7,3% от время. Можете ли вы предложить альтернативный способ повышения производительности запроса, пожалуйста?

1 Ответ

1 голос
/ 07 февраля 2020

Проблема в том, что 1000 анализаторам запросов очень сложно оптимизировать. Это также затрудняет поиск и устранение неисправностей для вас и будущего члена команды, который наследует код.

Я рекомендую разбить запрос на части и выполнить следующие оптимизации:

  1. Использовать CREATE TEMPORARY TABLE AS вместо CTE. Добавьте ORDER BY при создании таблицы в столбце, к которому вы будете присоединяться или фильтровать. Временные таблицы проще для оптимизатора создавать и использовать позже. ORDER BY помогает Snowflake знать, что нужно оптимизировать с последующими объединениями с другими таблицами. Их также легче устранять.
  2. В вашем примере посмотрите, можете ли вы сохранить эти данные в виде постоянных столбцов, чтобы Snowflake могла пропустить часть преобразования и получить лучшую статистику по ней: TO_NUMBER​(​S​.​STARTDATE​) и IFF​(​S​.​ENDDATE IS NULL, '29991231', S​.​ENDDATE​)​.
  3. В качестве альтернативы шагу 2 вместо сортировки по startDate и endDate посмотрите, можете ли вы добавить IDENTITY, SEQUENCE или заполнить столбец INTEGER, который можно использовать в качестве ключа сортировки. Вы также можете буквально назвать этот новый столбец sortKey. Сортировка целого числа будет значительно быстрее, чем запуск функции в DATETIME, а затем упорядочение по ней.
  4. Если любой из CTE можно преобразовать в материализованные представления, они будут предварительно созданы и значительно быстрее.
  5. Наконец, все данные во временной таблице, упорядоченные по тем же столбцам, в которых была создана ваша целевая таблица, перед вставкой. Это ускорит сам шаг вставки, и Snowflake будет проще обрабатывать параллельные изменения в этой таблице.

Примечания:

  1. Для создания временного table : create or replace temporary table table1 as select * from dual; После этого вы ссылаетесь на table1 вместо вашего кода вместо CTE.
  2. Материализованные представления документированы здесь . Они - особенность выпуска Enterprise. Их синтаксис: create materialized view mymv as select col1, col2 from mytable;
...