SlideShare a Scribd company logo
Производительность запросов в PostgreSQL - шаг за шагом
Илья Космодемьянский
ik@postgresql-consulting.com
План
• Что значит оптимизировать запросы?
• Когда начинать оптимизировать запросы?
• Какие запросы оптимизировать?
• Как оптимизировать запросы?
• Какие запросы бесполезно оптимизировать?
Проблема не новая
Обыкновенно в теории заботятся и
считают хорошим достижением,
если удается повысить
коэффициент полезного действия
винта на 4%, а практика
показывает, что от механика,
машинистов и кочегаров зависят не
4–5%, а 70–75%.
Крылов А.Н.
"Мои воспоминания"
Что значит оптимизировать запросы?
• Задача редко ставится в такой форме
Что значит оптимизировать запросы?
• Задача редко ставится в такой форме
• «Всё плохо»- более типичная постановка
Что значит оптимизировать запросы?
• Задача редко ставится в такой форме
• «Всё плохо»- более типичная постановка
• Медленные запросы просто видны наружу
Что значит оптимизировать запросы?
• Задача редко ставится в такой форме
• «Всё плохо»- более типичная постановка
• Медленные запросы просто видны наружу
• На ненастроенной базе запросы оптимизировать бесполезно
Что значит ненастроенная база?
• Выключен или не настроен автовакуум
• 100500 подключений без pgbouncer
• ...
Алгоритм
• Проверить настройки
• Отобрать запросы для оптимизации
• Оптимизировать запросы
• Повторить
Какие запросы оптимизировать?
• Все подряд - бесполезно
• Отобрать top
• pg_stat_statements
Изучаем top
total time: 06:01:33 (IO: 1.15%)
total queries: 896,507,876 (unique: 377)
report for all databases, version 0.9.2
=============================================================================================================
pos:1 total time: 01:27:08 (24.1%, CPU: 24.4%, IO: 0.0%) calls: 1,038,397 (0.12%) avg_time: 5.03ms (IO: 0.0%)
user: someuser db: somedb rows: 1,754,836 query:
select q.id, q.type, q.servertime, q.clienttime from foo q left outer join bar qq ON q.buzzid = qq.buzzid where qq.yaid
=============================================================================================================
pos:2 total time: 00:28:56 (8.0%, CPU: 8.1%, IO: 0.0%) calls: 120,782,681 (13.47%) avg_time: 0.01ms (IO: 0.0%)
user: someuser db: somedb rows: 557,454,570 query:
select seqid, id, name, notes from bar where pvid = $1 order by id asc
https://github.com/PostgreSQL-Consulting/pg-utils/tree/master/sql/global_reports
Что такое "запрос работает медленно?"
• Запрос работает 123,0 ms
Что такое "запрос работает медленно?"
• Запрос работает 123,0 ms
• Запрос работает 7300,0 ms
Что такое "запрос работает медленно?"
• Запрос работает 123,0 ms
• Запрос работает 7300,0 ms
• Запрос работает 3 min
Что такое "запрос работает медленно?"
• Запрос работает 123,0 ms
• Запрос работает 7300,0 ms
• Запрос работает 3 min
• Запрос работает 0.12 ms
Более правильный подход
• Как часто исполняется запрос
Более правильный подход
• Как часто исполняется запрос
• Какое время отклика мы считаем приемлемым
Более правильный подход
• Как часто исполняется запрос
• Какое время отклика мы считаем приемлемым
• Каков характер нагрузки на базе?
Более правильный подход
• Как часто исполняется запрос
• Какое время отклика мы считаем приемлемым
• Каков характер нагрузки на базе?
• Какой процент ресурсов базы занимает данный запрос
На чем расходуется время при выполнении запроса
• Передача запроса от клиента (НЕ СМЕШНО!)
На чем расходуется время при выполнении запроса
• Передача запроса от клиента (НЕ СМЕШНО!)
• Парсинг
На чем расходуется время при выполнении запроса
• Передача запроса от клиента (НЕ СМЕШНО!)
• Парсинг
• Оптимизация
На чем расходуется время при выполнении запроса
• Передача запроса от клиента (НЕ СМЕШНО!)
• Парсинг
• Оптимизация
• Исполнение
На чем расходуется время при выполнении запроса
• Передача запроса от клиента (НЕ СМЕШНО!)
• Парсинг
• Оптимизация
• Исполнение
• Возврат результатов
Передача запроса от клиента
select id, name, from table id in(312,3443,543,4,76,13,78,98,090,435,565,
2317,1145,76777,23,5678,776,9869,3242,65645,2423,43221,
10,4545,320,59,298,405,47832,5497579,5349934,286438,
5489584,2737284728,43,7б,4б8,3,854,2094,3293826,4773,
394394,5720853,403059,84885,.................
EXPLAIN
PREPARE query(int, int) AS SELECT sum(bar) FROM test WHERE id > $1 AND id < $2 GROUP BY foo;
EXPLAIN ANALYZE EXECUTE query(100, 200);
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------
HashAggregate (cost=9.54..9.54 rows=1 width=8) (actual time=0.156..0.161 rows=11 loops=1)
Group Key: foo
-> Index Scan using test_pkey on test (cost=0.29..9.29 rows=50 width=8) (actual time=0.039..0.091 rows=99 loops=1)
Index Cond: ((id > $1) AND (id < $2))
Planning time: 0.197 ms
Execution time: 0.225 ms
(6 rows)
pg@pglect01:~/dellstore2-normal-1.0> psql dellstore2 -c ’explain (analyze on, buffers on) select count(*) from customers’
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------
Aggregate (cost=738.00..738.01 rows=1 width=0) (actual time=8.357..8.357 rows=1 loops=1)
Buffers: shared hit=488
-> Seq Scan on customers (cost=0.00..688.00 rows=20000 width=0) (actual time=0.026..5.728 rows=20000 loops=1)
Buffers: shared hit=488
Total runtime: 8.607 ms
(5 rows)
Почему не используетеся индекс?
• Собрана-ли статистика?
• Ускорит-ли индекс исполнение запроса?
• Правильно-ли написан запрос? (where counter + 1 = 46)
Почему join работает медленно?
• Какой тип используется?
• Есть-ли индексы?
• Достаточно-ли памяти?
Длинный IN (очень любят ORM)
1. SELECT * FROM test WHERE id<10000
1.2ms
2. SELECT * FROM test WHERE id<10000 AND val IN (список от 1 до 10)
2.1ms
3. SELECT * FROM test WHERE id<10000 AND val IN (список от 1 до 100)
6ms
4. SELECT * FROM test WHERE id<10000 AND val IN (список от 1 до 1000)
38ms
5. SELECT * FROM test WHERE id<10000 AND val IN (список от 1 до 10000)
380ms (и далее линейно от длинны массива)
IN (1,...100)
explain analyze select * from test where id<10000 and val IN (1,...100);
QUERY PLAN
--------------------------------------------------------------------------------------------------
Index Scan using test_pkey on test (cost=0.43..1666.85 rows=10
width=140) (actual time=0.448..5.602 rows=16 loops=1)
Index Cond: (id < 10000)
Filter: (val = ANY (’{1,...100}’::integer[]))
Rows Removed by Filter: 9984
Длинный IN (hash join)
explain select count(*) from test JOIN (VALUES (1),...,(10)) AS v(val) USING (val) where id<10000;
QUERY PLAN
------------------------------------------------------------------------
Aggregate (cost=497.65..497.66 rows=1 width=0)
-> Hash Join (cost=0.69..497.65 rows=1 width=0)
Hash Cond: (test.val = "*VALUES*".column1)
-> Index Scan using test_pkey on test (cost=0.43..461.22
rows=9645 width=4)
Index Cond: (id < 10000)
-> Hash (cost=0.12..0.12 rows=10 width=4)
-> Values Scan on "*VALUES*" (cost=0.00..0.12 rows=10 width=4)
Длинный IN (Итоги с hash join)
1. SELECT * FROM test WHERE id<10000
1.2ms
2. JOIN (VALUES (1),...,(10))
1.6ms (было 2.1ms)
3. JOIN (VALUES (1),...,(100))
2ms (было 6ms)
4. JOIN (VALUES (1),...,(1000))
3.9ms (было 38ms)
5. JOIN (VALUES (1),...,(10000))
10ms (было 380ms)
"Этот запрос не будет работать быстро никогда"
• count(*)
• join на 300 таблиц
• Запрос возвращает клиенту 1 000 000 000 строк
• Все это серьезные причины для переделки бизнес-логики
Вопросы?
ik@postgresql-consulting.com

More Related Content

What's hot (20)

Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
Ontico
 
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
Ontico
 
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
Ontico
 
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Ontico
 
Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...
Ontico
 
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
Ontico
 
Как устроена MySQL-репликация / Андрей Аксенов (Sphinx)
Как устроена MySQL-репликация / Андрей Аксенов (Sphinx)
Ontico
 
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
Ontico
 
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Ontico
 
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Ontico
 
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Ontico
 
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
Ontico
 
My talk at Highload++ 2015
My talk at Highload++ 2015
Alex Chistyakov
 
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Ontico
 
Чему мы научились разрабатывая микросервисы?
Чему мы научились разрабатывая микросервисы?
Vadim Madison
 
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Ontico
 
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
Ontico
 
Дмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в Badoo
Mail.ru Group
 
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Ontico
 
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
Ontico
 
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
Ontico
 
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
Ontico
 
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
Ontico
 
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Ontico
 
Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...
Ontico
 
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
Ontico
 
Как устроена MySQL-репликация / Андрей Аксенов (Sphinx)
Как устроена MySQL-репликация / Андрей Аксенов (Sphinx)
Ontico
 
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
Ontico
 
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Ontico
 
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Ontico
 
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Ontico
 
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
Ontico
 
My talk at Highload++ 2015
My talk at Highload++ 2015
Alex Chistyakov
 
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Ontico
 
Чему мы научились разрабатывая микросервисы?
Чему мы научились разрабатывая микросервисы?
Vadim Madison
 
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Ontico
 
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
Ontico
 
Дмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в Badoo
Mail.ru Group
 
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Ontico
 
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
Ontico
 

Viewers also liked (12)

Как понять, что происходит на сервере? / Александр Крижановский (NatSys Lab.,...
Как понять, что происходит на сервере? / Александр Крижановский (NatSys Lab.,...
Ontico
 
Кэширование данных в web приложениях. Использование memcached / Юрий Красноще...
Кэширование данных в web приложениях. Использование memcached / Юрий Красноще...
Ontico
 
Как устроен поиск / Андрей Аксенов (Sphinx)
Как устроен поиск / Андрей Аксенов (Sphinx)
Ontico
 
С чего начать внедрение Hadoop в компании / Алексей Еремихин (Badoo)
С чего начать внедрение Hadoop в компании / Алексей Еремихин (Badoo)
Ontico
 
Поддержка высоконагруженного проекта: мониторинг, резервирование, обслуживани...
Поддержка высоконагруженного проекта: мониторинг, резервирование, обслуживани...
Ontico
 
Какие бывают провайдеры услуг дата-центров и как выбрать оптимальный? / Игорь...
Какие бывают провайдеры услуг дата-центров и как выбрать оптимальный? / Игорь...
Ontico
 
NoSQL - коротко о главном / Сергей Туленцев (TextMaster)
NoSQL - коротко о главном / Сергей Туленцев (TextMaster)
Ontico
 
Как балансировать на «сетевом» канате под куполом тяжелой нагрузки? / Сергей ...
Как балансировать на «сетевом» канате под куполом тяжелой нагрузки? / Сергей ...
Ontico
 
Бинарные (файловые) хранилища: страшная сказка с мрачным концом / Даниил Подо...
Бинарные (файловые) хранилища: страшная сказка с мрачным концом / Даниил Подо...
Ontico
 
Горизонтальное масштабирование: что, зачем, когда и как /Александр Макаров (Y...
Горизонтальное масштабирование: что, зачем, когда и как /Александр Макаров (Y...
Ontico
 
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
Ontico
 
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
Ontico
 
Как понять, что происходит на сервере? / Александр Крижановский (NatSys Lab.,...
Как понять, что происходит на сервере? / Александр Крижановский (NatSys Lab.,...
Ontico
 
Кэширование данных в web приложениях. Использование memcached / Юрий Красноще...
Кэширование данных в web приложениях. Использование memcached / Юрий Красноще...
Ontico
 
Как устроен поиск / Андрей Аксенов (Sphinx)
Как устроен поиск / Андрей Аксенов (Sphinx)
Ontico
 
С чего начать внедрение Hadoop в компании / Алексей Еремихин (Badoo)
С чего начать внедрение Hadoop в компании / Алексей Еремихин (Badoo)
Ontico
 
Поддержка высоконагруженного проекта: мониторинг, резервирование, обслуживани...
Поддержка высоконагруженного проекта: мониторинг, резервирование, обслуживани...
Ontico
 
Какие бывают провайдеры услуг дата-центров и как выбрать оптимальный? / Игорь...
Какие бывают провайдеры услуг дата-центров и как выбрать оптимальный? / Игорь...
Ontico
 
NoSQL - коротко о главном / Сергей Туленцев (TextMaster)
NoSQL - коротко о главном / Сергей Туленцев (TextMaster)
Ontico
 
Как балансировать на «сетевом» канате под куполом тяжелой нагрузки? / Сергей ...
Как балансировать на «сетевом» канате под куполом тяжелой нагрузки? / Сергей ...
Ontico
 
Бинарные (файловые) хранилища: страшная сказка с мрачным концом / Даниил Подо...
Бинарные (файловые) хранилища: страшная сказка с мрачным концом / Даниил Подо...
Ontico
 
Горизонтальное масштабирование: что, зачем, когда и как /Александр Макаров (Y...
Горизонтальное масштабирование: что, зачем, когда и как /Александр Макаров (Y...
Ontico
 
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
Эволюция процесса деплоя в проекте / Денис Яковлев (2ГИС)
Ontico
 
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
Ontico
 
Ad

Similar to Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянский (PostgreSQL-Consulting.com) (20)

Народные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQL
Nikolay Pisarev
 
Иван Фролков
Иван Фролков
CodeFest
 
PostgreSQL performance recipes
PostgreSQL performance recipes
Alexey Ermakov
 
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Ontico
 
Query perfomance tuning
Query perfomance tuning
collabock
 
поиск узких мест в производительности My sql ботанический определитель. г. ру...
поиск узких мест в производительности My sql ботанический определитель. г. ру...
rit2011
 
Оптимизации скорости выполнения запросов
Оптимизации скорости выполнения запросов
Alex.Kolonitsky
 
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
Nikolay Samokhvalov
 
Как читать и интерпретировать вывод команды EXPLAIN
Как читать и интерпретировать вывод команды EXPLAIN
Alexey Ermakov
 
Архитектура и новые возможности B-tree
Архитектура и новые возможности B-tree
Anastasia Lubennikova
 
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
Technopark
 
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"
Technopark
 
MySQL Optimization. Russian
MySQL Optimization. Russian
Rawan Qurmet
 
SQL-ник DevDay. Каменский. Расширенный SQL в MySQL и PostgreSQL. Сравнение во...
SQL-ник DevDay. Каменский. Расширенный SQL в MySQL и PostgreSQL. Сравнение во...
DevDay
 
Troubleshooting my sql_performance_addons
Troubleshooting my sql_performance_addons
Sveta Smirnova
 
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Sveta Smirnova
 
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Ontico
 
Андрей Аксёнов, Sphinx Technologies Inc.
Андрей Аксёнов, Sphinx Technologies Inc.
Ontico
 
Sphinx 2013
Sphinx 2013
Andrew Aksyonoff
 
SAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentation
Nikolay Samokhvalov
 
Народные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQL
Nikolay Pisarev
 
Иван Фролков
Иван Фролков
CodeFest
 
PostgreSQL performance recipes
PostgreSQL performance recipes
Alexey Ermakov
 
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Ontico
 
Query perfomance tuning
Query perfomance tuning
collabock
 
поиск узких мест в производительности My sql ботанический определитель. г. ру...
поиск узких мест в производительности My sql ботанический определитель. г. ру...
rit2011
 
Оптимизации скорости выполнения запросов
Оптимизации скорости выполнения запросов
Alex.Kolonitsky
 
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
Nikolay Samokhvalov
 
Как читать и интерпретировать вывод команды EXPLAIN
Как читать и интерпретировать вывод команды EXPLAIN
Alexey Ermakov
 
Архитектура и новые возможности B-tree
Архитектура и новые возможности B-tree
Anastasia Lubennikova
 
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
Technopark
 
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"
Technopark
 
MySQL Optimization. Russian
MySQL Optimization. Russian
Rawan Qurmet
 
SQL-ник DevDay. Каменский. Расширенный SQL в MySQL и PostgreSQL. Сравнение во...
SQL-ник DevDay. Каменский. Расширенный SQL в MySQL и PostgreSQL. Сравнение во...
DevDay
 
Troubleshooting my sql_performance_addons
Troubleshooting my sql_performance_addons
Sveta Smirnova
 
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Sveta Smirnova
 
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Ontico
 
Андрей Аксёнов, Sphinx Technologies Inc.
Андрей Аксёнов, Sphinx Technologies Inc.
Ontico
 
SAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentation
Nikolay Samokhvalov
 
Ad

More from Ontico (20)

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Ontico
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Ontico
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Ontico
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Ontico
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Ontico
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
Ontico
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Ontico
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Ontico
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
Ontico
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
Ontico
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Ontico
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Ontico
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Ontico
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Ontico
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
Ontico
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Ontico
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Ontico
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
Ontico
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Ontico
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Ontico
 
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Ontico
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Ontico
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Ontico
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Ontico
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Ontico
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
Ontico
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Ontico
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Ontico
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
Ontico
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
Ontico
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Ontico
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Ontico
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Ontico
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Ontico
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
Ontico
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Ontico
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Ontico
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
Ontico
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Ontico
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Ontico
 

Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянский (PostgreSQL-Consulting.com)

  • 1. Производительность запросов в PostgreSQL - шаг за шагом Илья Космодемьянский [email protected]
  • 2. План • Что значит оптимизировать запросы? • Когда начинать оптимизировать запросы? • Какие запросы оптимизировать? • Как оптимизировать запросы? • Какие запросы бесполезно оптимизировать?
  • 3. Проблема не новая Обыкновенно в теории заботятся и считают хорошим достижением, если удается повысить коэффициент полезного действия винта на 4%, а практика показывает, что от механика, машинистов и кочегаров зависят не 4–5%, а 70–75%. Крылов А.Н. "Мои воспоминания"
  • 4. Что значит оптимизировать запросы? • Задача редко ставится в такой форме
  • 5. Что значит оптимизировать запросы? • Задача редко ставится в такой форме • «Всё плохо»- более типичная постановка
  • 6. Что значит оптимизировать запросы? • Задача редко ставится в такой форме • «Всё плохо»- более типичная постановка • Медленные запросы просто видны наружу
  • 7. Что значит оптимизировать запросы? • Задача редко ставится в такой форме • «Всё плохо»- более типичная постановка • Медленные запросы просто видны наружу • На ненастроенной базе запросы оптимизировать бесполезно
  • 8. Что значит ненастроенная база? • Выключен или не настроен автовакуум • 100500 подключений без pgbouncer • ...
  • 9. Алгоритм • Проверить настройки • Отобрать запросы для оптимизации • Оптимизировать запросы • Повторить
  • 10. Какие запросы оптимизировать? • Все подряд - бесполезно • Отобрать top • pg_stat_statements
  • 11. Изучаем top total time: 06:01:33 (IO: 1.15%) total queries: 896,507,876 (unique: 377) report for all databases, version 0.9.2 ============================================================================================================= pos:1 total time: 01:27:08 (24.1%, CPU: 24.4%, IO: 0.0%) calls: 1,038,397 (0.12%) avg_time: 5.03ms (IO: 0.0%) user: someuser db: somedb rows: 1,754,836 query: select q.id, q.type, q.servertime, q.clienttime from foo q left outer join bar qq ON q.buzzid = qq.buzzid where qq.yaid ============================================================================================================= pos:2 total time: 00:28:56 (8.0%, CPU: 8.1%, IO: 0.0%) calls: 120,782,681 (13.47%) avg_time: 0.01ms (IO: 0.0%) user: someuser db: somedb rows: 557,454,570 query: select seqid, id, name, notes from bar where pvid = $1 order by id asc https://github.com/PostgreSQL-Consulting/pg-utils/tree/master/sql/global_reports
  • 12. Что такое "запрос работает медленно?" • Запрос работает 123,0 ms
  • 13. Что такое "запрос работает медленно?" • Запрос работает 123,0 ms • Запрос работает 7300,0 ms
  • 14. Что такое "запрос работает медленно?" • Запрос работает 123,0 ms • Запрос работает 7300,0 ms • Запрос работает 3 min
  • 15. Что такое "запрос работает медленно?" • Запрос работает 123,0 ms • Запрос работает 7300,0 ms • Запрос работает 3 min • Запрос работает 0.12 ms
  • 16. Более правильный подход • Как часто исполняется запрос
  • 17. Более правильный подход • Как часто исполняется запрос • Какое время отклика мы считаем приемлемым
  • 18. Более правильный подход • Как часто исполняется запрос • Какое время отклика мы считаем приемлемым • Каков характер нагрузки на базе?
  • 19. Более правильный подход • Как часто исполняется запрос • Какое время отклика мы считаем приемлемым • Каков характер нагрузки на базе? • Какой процент ресурсов базы занимает данный запрос
  • 20. На чем расходуется время при выполнении запроса • Передача запроса от клиента (НЕ СМЕШНО!)
  • 21. На чем расходуется время при выполнении запроса • Передача запроса от клиента (НЕ СМЕШНО!) • Парсинг
  • 22. На чем расходуется время при выполнении запроса • Передача запроса от клиента (НЕ СМЕШНО!) • Парсинг • Оптимизация
  • 23. На чем расходуется время при выполнении запроса • Передача запроса от клиента (НЕ СМЕШНО!) • Парсинг • Оптимизация • Исполнение
  • 24. На чем расходуется время при выполнении запроса • Передача запроса от клиента (НЕ СМЕШНО!) • Парсинг • Оптимизация • Исполнение • Возврат результатов
  • 25. Передача запроса от клиента select id, name, from table id in(312,3443,543,4,76,13,78,98,090,435,565, 2317,1145,76777,23,5678,776,9869,3242,65645,2423,43221, 10,4545,320,59,298,405,47832,5497579,5349934,286438, 5489584,2737284728,43,7б,4б8,3,854,2094,3293826,4773, 394394,5720853,403059,84885,.................
  • 26. EXPLAIN PREPARE query(int, int) AS SELECT sum(bar) FROM test WHERE id > $1 AND id < $2 GROUP BY foo; EXPLAIN ANALYZE EXECUTE query(100, 200); QUERY PLAN ------------------------------------------------------------------------------------------------------------------------ HashAggregate (cost=9.54..9.54 rows=1 width=8) (actual time=0.156..0.161 rows=11 loops=1) Group Key: foo -> Index Scan using test_pkey on test (cost=0.29..9.29 rows=50 width=8) (actual time=0.039..0.091 rows=99 loops=1) Index Cond: ((id > $1) AND (id < $2)) Planning time: 0.197 ms Execution time: 0.225 ms (6 rows) pg@pglect01:~/dellstore2-normal-1.0> psql dellstore2 -c ’explain (analyze on, buffers on) select count(*) from customers’ QUERY PLAN ------------------------------------------------------------------------------------------------------------------- Aggregate (cost=738.00..738.01 rows=1 width=0) (actual time=8.357..8.357 rows=1 loops=1) Buffers: shared hit=488 -> Seq Scan on customers (cost=0.00..688.00 rows=20000 width=0) (actual time=0.026..5.728 rows=20000 loops=1) Buffers: shared hit=488 Total runtime: 8.607 ms (5 rows)
  • 27. Почему не используетеся индекс? • Собрана-ли статистика? • Ускорит-ли индекс исполнение запроса? • Правильно-ли написан запрос? (where counter + 1 = 46)
  • 28. Почему join работает медленно? • Какой тип используется? • Есть-ли индексы? • Достаточно-ли памяти?
  • 29. Длинный IN (очень любят ORM) 1. SELECT * FROM test WHERE id<10000 1.2ms 2. SELECT * FROM test WHERE id<10000 AND val IN (список от 1 до 10) 2.1ms 3. SELECT * FROM test WHERE id<10000 AND val IN (список от 1 до 100) 6ms 4. SELECT * FROM test WHERE id<10000 AND val IN (список от 1 до 1000) 38ms 5. SELECT * FROM test WHERE id<10000 AND val IN (список от 1 до 10000) 380ms (и далее линейно от длинны массива)
  • 30. IN (1,...100) explain analyze select * from test where id<10000 and val IN (1,...100); QUERY PLAN -------------------------------------------------------------------------------------------------- Index Scan using test_pkey on test (cost=0.43..1666.85 rows=10 width=140) (actual time=0.448..5.602 rows=16 loops=1) Index Cond: (id < 10000) Filter: (val = ANY (’{1,...100}’::integer[])) Rows Removed by Filter: 9984
  • 31. Длинный IN (hash join) explain select count(*) from test JOIN (VALUES (1),...,(10)) AS v(val) USING (val) where id<10000; QUERY PLAN ------------------------------------------------------------------------ Aggregate (cost=497.65..497.66 rows=1 width=0) -> Hash Join (cost=0.69..497.65 rows=1 width=0) Hash Cond: (test.val = "*VALUES*".column1) -> Index Scan using test_pkey on test (cost=0.43..461.22 rows=9645 width=4) Index Cond: (id < 10000) -> Hash (cost=0.12..0.12 rows=10 width=4) -> Values Scan on "*VALUES*" (cost=0.00..0.12 rows=10 width=4)
  • 32. Длинный IN (Итоги с hash join) 1. SELECT * FROM test WHERE id<10000 1.2ms 2. JOIN (VALUES (1),...,(10)) 1.6ms (было 2.1ms) 3. JOIN (VALUES (1),...,(100)) 2ms (было 6ms) 4. JOIN (VALUES (1),...,(1000)) 3.9ms (было 38ms) 5. JOIN (VALUES (1),...,(10000)) 10ms (было 380ms)
  • 33. "Этот запрос не будет работать быстро никогда" • count(*) • join на 300 таблиц • Запрос возвращает клиенту 1 000 000 000 строк • Все это серьезные причины для переделки бизнес-логики