SQL оптимизация: работа с дублями

Работа с дублями

GROUP BY вместо DISTINCT

Must Have

Оператор DISTINCT часто используется для удаления дубликатов, но GROUP BY может быть более эффективным, особенно когда нужно агрегировать данные.

Пример с DISTINCT:

SELECT DISTINCT customer_id, order_date 
FROM orders;

Более эффективный вариант с GROUP BY:

SELECT customer_id, order_date 
FROM orders 
GROUP BY customer_id, order_date;

С GROUP BY запрос будет лучше отрабатывать на больших объемах, а на маленьких разницы нет.

Если уверены, что дублей нет, не удаляйте дубликаты

Should Have

Если вы знаете, что в результате запроса не будет дубликатов (например, выбираете по первичному ключу), не используйте DISTINCT или GROUP BY - это только замедлит запрос.

Неоптимальный запрос:

SELECT DISTINCT product_id, product_name 
FROM products 
WHERE product_id = 123;

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

SELECT product_id, product_name 
FROM products 
WHERE product_id = 123;

UNION ALL вместо UNION

Must Have

UNION автоматически удаляет дубликаты, что требует дополнительных ресурсов. Если вы уверены, что дубликатов не будет или они допустимы, используйте UNION ALL.

Неоптимальный запрос:

SELECT product_id FROM products_2022
UNION
SELECT product_id FROM products_2023;

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

SELECT product_id FROM products_2022
UNION ALL
SELECT product_id FROM products_2023;

UNION ALL может работать в несколько раз быстрее, так как не тратит ресурсы на поиск и удаление дубликатов.