Оптимальные запросы

Введение в 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...