Otimização de consultas no Snowflake

Introdução ao Snowflake SQL

George Boorman

Senior Curriculum Manager, DataCamp

Por que otimizar consultas no Snowflake?

  • Resultados mais rápidos
  • Custo menor
    • Consultas mais curtas usam menos CPU e memória.

Imagem mostrando alto uso de CPU e memória gerando custo

Introdução ao Snowflake SQL

Problemas comuns em consultas

  • Joins explosivos: cuidado!

Incorreto

SELECT *
FROM order_details AS od
JOIN pizzas AS p -- Falta a condição ON, causando join explosivo

Resultados da consulta sem condição ON: muitas linhas e tempo alto

Introdução ao Snowflake SQL

Problemas comuns em consultas

  • Joins explosivos: cuidado!

Correto

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

Resultados da consulta com condição ON

Introdução ao Snowflake SQL

Problemas comuns em consultas

  • UNION vs UNION ALL: saiba a diferença
    • UNION remove duplicados e é mais lento
    • UNION ALL é mais rápido se não houver duplicados
  • Lidando com big data
    • Use filtros para reduzir os dados
    • Aplique limites para resultados rápidos
Introdução ao Snowflake SQL

Como otimizar consultas?

SELECT * ⌛

SELECT
    *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Detalhes da consulta: tempo e linhas

SELECT LIMIT 10* ⚡

SELECT *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS
LIMIT 10

Detalhes da consulta com LIMIT 10

Introdução ao Snowflake SQL

Como otimizar consultas?

Usando SELECT *

SELECT 
    *
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Detalhes da consulta: tempo e linhas

Evite SELECT *

SELECT o_orderdate, 
    o_orderstatus 
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF100.ORDERS

Detalhes da consulta com nomes de colunas

Introdução ao Snowflake SQL

Como otimizar consultas?

Filtre cedo

  • Use a cláusula WHERE no início
  • Aplique filtros antes dos JOINs
    • O JOIN processará menos linhas
Introdução ao Snowflake SQL

Sem filtragem antecipada

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';  -- Filtrando após o JOIN
Introdução ao Snowflake SQL

Com filtragem antecipada

WITH filtered_orders AS (
  SELECT *
  FROM orders
  WHERE order_date = '2015-01-01'  -- Filtrando no CTE antes do JOIN
)
SELECT filtered_orders.order_id, 
       filtered_orders.order_date, 
       pizza_type.name, 
       pizzas.pizza_size
FROM filtered_orders -- Juntando com o 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;
Introdução ao Snowflake SQL

Histórico de consultas

  • Histórico de consultas
    • snowflake.account_usage.query_history
    • O histórico traz métricas como tempo de execução
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: correspondência de string sem diferenciar maiúsculas/minúsculas
Introdução ao Snowflake SQL

Histórico de consultas

  • Encontre consultas lentas ou muito frequentes
SELECT query_text, 
    start_time, 
    end_time, 
    execution_time 
FROM
   snowflake.account_usage.query_history
WHERE
   execution_time > 1000

Filtrando por tempo de execução > 1000 ms

Introdução ao Snowflake SQL

Vamos praticar!

Introdução ao Snowflake SQL

Preparing Video For Download...