Оптимизация запросов в Snowflake

Введение в Snowflake SQL

George Boorman

Senior Curriculum Manager, DataCamp

Зачем оптимизировать запросы в Snowflake?

  • Более быстрые результаты
  • Экономия ресурсов
    • Короткие запросы потребляют меньше CPU и памяти.

Изображение высокой нагрузки на CPU и память с денежными затратами

Введение в Snowflake SQL

Распространённые проблемы запросов

  • Взрывные соединения: будьте осторожны!

Неверно

SELECT *
FROM order_details AS od
JOIN pizzas AS p -- Missing ON condition leading to exploding joins

Результаты запроса со временем выполнения и числом строк без условия ON

Введение в Snowflake SQL

Распространённые проблемы запросов

  • Взрывные соединения: будьте осторожны!

Верно

SELECT *
FROM order_details AS od
JOIN pizzas AS p
ON od.pizza_id = p.pizza_id

Результаты запроса со временем выполнения и числом строк с условием ON

Введение в Snowflake SQL

Распространённые проблемы запросов

  • UNION или UNION ALL: в чём разница
    • UNION удаляет дубликаты и замедляет запрос
    • UNION ALL быстрее при отсутствии дубликатов
  • Работа с большими данными
    • Используйте фильтры для сужения данных
    • Применяйте ограничения для ускорения результатов
Введение в Snowflake SQL

Как оптимизировать запросы?

SELECT * ⌛

SELECT
    *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Детали запроса: время выполнения и число строк

SELECT LIMIT 10* ⚡

SELECT *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS
LIMIT 10

Детали запроса: время выполнения и число строк с LIMIT 10

Введение в Snowflake SQL

Как оптимизировать запросы?

Использование SELECT *

SELECT 
    *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Детали запроса: время выполнения и число строк

Избегайте SELECT *

SELECT o_orderdate, 
    o_orderstatus 
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Детали запроса: время выполнения и число строк с указанием имён столбцов

Введение в Snowflake SQL

Как оптимизировать запросы?

Ранняя фильтрация

  • Применяйте клаузу WHERE как можно раньше
  • Фильтруйте данные до JOINов
    • JOIN обработает меньше строк
Введение в Snowflake SQL

Без ранней фильтрации

SELECT orders.order_id, 
       orders.order_date, 
       pizza_type.name, 
       pizzas.pizza_size
FROM orders
JOIN order_details 
ON orders.order_id = order_details.order_id
JOIN pizzas 
ON order_details.pizza_id = pizzas.pizza_id
JOIN pizza_type 
ON pizzas.pizza_type_id = pizza_type.pizza_type_id
WHERE orders.order_date = '2015-01-01';  -- Filtering after JOIN
Введение в Snowflake SQL

С ранней фильтрацией

WITH filtered_orders AS (
  SELECT *
  FROM orders
  WHERE order_date = '2015-01-01'  -- Filtering in CTE before JOIN
)
SELECT filtered_orders.order_id, 
       filtered_orders.order_date, 
       pizza_type.name, 
       pizzas.pizza_size
FROM filtered_orders -- Joining with CTE
JOIN order_details
ON filtered_orders.order_id = order_details.order_id
JOIN pizzas
ON order_details.pizza_id = pizzas.pizza_id
JOIN pizza_type
ON pizzas.pizza_type_id = pizza_type.pizza_type_id;
Введение в Snowflake SQL

История запросов

  • История запросов
    • snowflake.account_usage.query_history
    • История запросов содержит различные метрики, в том числе время выполнения
SELECT query_text, start_time, end_time, execution_time 
FROM
   snowflake.account_usage.query_history
WHERE query_text ILIKE '%order_details%'

Screenshot 2023-09-01 at 14.32.29.png

  • ILIKE: поиск строк без учёта регистра
Введение в Snowflake SQL

История запросов

  • Выявление медленных или часто выполняемых запросов
SELECT query_text, 
    start_time, 
    end_time, 
    execution_time 
FROM
   snowflake.account_usage.query_history
WHERE
   execution_time > 1000

Результаты фильтрации по времени выполнения больше 1000 мс

Введение в Snowflake SQL

Давайте потренируемся!

Введение в Snowflake SQL

Preparing Video For Download...