Пишемо оптимальні запити

Вступ до Redshift

Jason Myers

Principal Engineer

Обмежуйте стовпці

  • Уникайте SELECT *
  • Не вибирайте стовпці, які не потрібні в результаті
    • Пам'ятайте: Redshift колонковий і читає дані за стовпцями
Вступ до Redshift

Використовуйте DISTKEY і SORTKEYs

Використовуйте в таких клаузах, де можливо

  • JOIN
  • WHERE
  • GROUP BY

 

Використовуйте SORTKEYs у тому ж порядку в ORDER BY

  • Дуже оптимізовано sortkey_1, sortkey_2, sortkey_3
  • Не оптимізовано sort_key_1, sort_key_3

Розподілені запити

Вступ до Redshift

Створюємо якісні предикати

  • Використовуйте DISTKEY і SORTKEY
  • Наближайтеся до з'єднуваної таблиці
  • Уникайте функцій у них
SELECT receipts.cookie_id, 
       sum(receipts.total)
FROM receipts
JOIN cookies ON receipts.cookie_id = cookies.cookie_id
  -- Keep cookies predicates in the join to push down to nodes holding the records for cookies
 AND cookies.available_on < '2023-11-14'
 AND cookies.end_of_sale IS null
-- Predicates that are not part of the join or on the joined table stay in the WHERE clause
WHERE receipts.order_time > '2023-11-13'
GROUP BY 1 ORDER BY 1;
Вступ до Redshift

Дотримуйтеся сталого порядку стовпців

Коли використовуєте:

  • GROUP BY
  • ORDER BY

Погано

GROUP BY col_one, col_two, col_three
ORDER BY col_two, col_three, col_one

Добре

GROUP BY col_two, col_three, col_one
ORDER BY col_two, col_three, col_one
Вступ до Redshift

Використовуйте підзапити з розумом

  • Застосовуйте належні стратегії з'єднання замість бездумних підзапитів
  • Використовуйте EXISTS у предикатах, коли лише перевіряєте істинність результату підзапиту
    SELECT column_name
    FROM table_name
    WHERE EXISTS
      (SELECT column_name 
       FROM table_name 
       WHERE active is True);
    
  • Якщо підзапити повторюються, використовуйте CTE для кешування
Вступ до Redshift

Давайте потренуємось!

Вступ до Redshift

Preparing Video For Download...