Нормализация и денормализация:
-- Пример денормализации для отчетов
ALTER TABLE orders ADD COLUMN customer_name VARCHAR(100);
UPDATE orders o
SET customer_name = c.name
FROM customers c
WHERE o.customer_id = c.id;
Правильные типы данных:
Создание оптимальных индексов:
-- Составной индекс для часто фильтруемых и сортируемых полей
CREATE INDEX idx_orders_date_status ON orders(order_date, status);
-- Частичный индекс для часто запрашиваемого подмножества
CREATE INDEX idx_active_users ON users(id) WHERE is_active = TRUE;
Анализ использования индексов:
EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 100;
Переписывание сложных запросов:
-- Вместо:
SELECT * FROM products
WHERE category_id IN (SELECT id FROM categories WHERE type = 'ELECTRONICS');
-- Лучше:
SELECT p.* FROM products p
JOIN categories c ON p.category_id = c.id
WHERE c.type = 'ELECTRONICS';
Ограничение выборки:
-- Для сложных отчетов
CREATE MATERIALIZED VIEW monthly_sales AS
SELECT
DATE_TRUNC('month', order_date) AS month,
SUM(amount) AS total
FROM orders
GROUP BY 1
REFRESH COMPLETE ON DEMAND;
Партиционирование больших таблиц:
CREATE TABLE sales (
id SERIAL,
sale_date DATE,
amount DECIMAL(10,2)
) PARTITION BY RANGE (sale_date);
Использование системных представлений:
-- Поиск медленных запросов в PostgreSQL
SELECT query, total_time
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 10;
До (занимал 2.5 сек):
SELECT * FROM orders
WHERE EXTRACT(YEAR FROM order_date) = 2023
AND status = 'COMPLETED';
После (0.1 сек):
CREATE INDEX idx_orders_year_status ON orders((EXTRACT(YEAR FROM order_date)), status);
SELECT * FROM orders
WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31'
AND status = 'COMPLETED';
Резюмируем: повышение производительности SQL требует комплексного подхода — от проектирования схемы БД до тонкой настройки запросов. Ключевые методы: правильное индексирование, оптимизация запросов, партиционирование и постоянный мониторинг.