[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-postgresql-kakie-osnovnye-priyomy-optimizatsii-zaprosov-v-postgresql":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},943,"kakie-osnovnye-priyomy-optimizatsii-zaprosov-v-postgresql",28,"postgresql","PostgreSQL","🐘","Какие основные приёмы оптимизации запросов в PostgreSQL?","Оптимизация запросов — это системный процесс: сначала EXPLAIN ANALYZE для диагностики, затем точечные изменения. Восемь основных приёмов покрывают подавляющее большинство ситуаций.\n\n### 1. Создание подходящих индексов\n\n```sql\nEXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 42 AND status = 'active';\n-- Если Seq Scan — создать индекс:\nCREATE INDEX idx_orders_cust_status ON orders (customer_id, status);\n```\n\n### 2. Актуальность статистики\n\n```sql\nANALYZE transactions;\n-- Увеличить детализацию статистики для столбца\nALTER TABLE transactions ALTER COLUMN status SET STATISTICS 1000;\nANALYZE transactions;\n```\n\n### 3. Выбирать только нужные столбцы\n\n```sql\n-- Плохо:\nSELECT * FROM transactions WHERE account_id = 100;\n-- Хорошо (может использовать Index Only Scan):\nSELECT id, amount, created_at FROM transactions WHERE account_id = 100;\n```\n\n### 4. Keyset pagination вместо OFFSET\n\n```sql\nSELECT * FROM transactions\nWHERE account_id = 100 AND id > 1000\nORDER BY id\nLIMIT 20;\n```\n\n### 5. Избегать функций на индексированных столбцах\n\n```sql\n-- Плохо (индекс не используется):\nSELECT * FROM users WHERE UPPER(email) = 'USER@BANK.RU';\n-- Хорошо (создать expression index):\nCREATE INDEX idx_email_upper ON users (UPPER(email));\n```\n\n### 6. EXISTS вместо IN для подзапросов\n\n```sql\n-- Менее эффективно для больших подзапросов:\nSELECT * FROM clients WHERE id IN (SELECT client_id FROM transactions WHERE amount > 1000000);\n-- Более эффективно:\nSELECT * FROM clients c WHERE EXISTS (\n    SELECT 1 FROM transactions t WHERE t.client_id = c.id AND t.amount > 1000000\n);\n```\n\n### 7. Параллельное выполнение запросов\n\n```sql\nSET max_parallel_workers_per_gather = 4;\n-- В EXPLAIN видно: Gather -> Parallel Seq Scan\n```\n\n### 8. Материализованные представления для аналитики\n\n```sql\nCREATE MATERIALIZED VIEW mv_daily_totals AS\nSELECT date(created_at) AS day, sum(amount) AS total\nFROM transactions GROUP BY date(created_at);\n\nREFRESH MATERIALIZED VIEW CONCURRENTLY mv_daily_totals;\n```\n\n> **На собеседовании:** не перечисляйте все приёмы списком — расскажите алгоритм: «сначала EXPLAIN ANALYZE, смотрю Seq Scan и Rows Removed, затем добавляю индекс или переписываю запрос». Это показывает системный подход, а не заученный список.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Какие основные приёмы оптимизации запросов в PostgreSQL? — Gymterview","Оптимизация запросов — это системный процесс: сначала EXPLAIN ANALYZE для диагностики, затем точечные изменения. Восемь основных приёмов покрывают подавляющее б","Оптимизация запросов — это системный процесс: сначала EXPLAIN ANALYZE для диагностики, затем точечные изменения. Восемь ",[7,13],"Оптимизация запросов — это системный процесс: сначала EXPLAIN ANALYZE для диагностики, затем точечные изменения. Восемь основных приёмов покрывают подавляющее большинство ситуаций.",true]