powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Ускорить запрос
10 сообщений из 10, страница 1 из 1
Ускорить запрос
    #40051926
Strikie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
На сервере порядка 10 баз данных,средний размер базы 10гб. Иногда на сервере поднимается iowait , доходит до 40% по zabbix
В логах пг иногда появляется:
temporary file: path "base/pgsql_tmp/pgsql_tmp27336.3", size 28202020
Вот запрос:
select * from Transactions T, DebitTokens D, CreditTokens C where (T.ID = D.ID) and (T.ID = C.ID) and (((C_Agreement in (38558956, 38558956)) or (D_Agreement in (38558956, 38558956))))

План запроса
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------------
Gather (cost=31708.55..56241.31 rows=185 width=648) (actual time=569.994..637.500 rows=10 loops=1)
Workers Planned: 3
Workers Launched: 3
-> Nested Loop (cost=30708.55..55222.81 rows=60 width=648) (actual time=580.163..595.466 rows=2 loops=4)
-> Parallel Hash Join (cost=30708.12..55193.07 rows=64 width=568) (actual time=580.136..595.417 rows=2 loops=4)
Hash Cond: (c.id = d.id)
Join Filter: ((c.c_agreement = ANY ('{38558956,38558956}'::integer[])) OR (d.d_agreement = ANY ('{38558956,38558956}'::integer[])))
Rows Removed by Join Filter: 472558
-> Parallel Seq Scan on credittokens c (cost=0.00..22982.94 rows=572194 width=284) (actual time=0.012..47.908 rows=472560 loops=4)
-> Parallel Hash (cost=23563.61..23563.61 rows=571561 width=284) (actual time=232.142..232.143 rows=472560 loops=4)
Buckets: 2097152 Batches: 1 Memory Usage: 152448kB
-> Parallel Seq Scan on debittokens d (cost=0.00..23563.61 rows=571561 width=284) (actual time=0.021..56.768 rows=472560 loops=4)
-> Index Scan using pk_transactions on transactions t (cost=0.43..0.46 rows=1 width=80) (actual time=0.015..0.015 rows=1 loops=10)
Index Cond: (id = d.id)
Planning Time: 0.680 ms
Execution Time: 637.666 ms
(16 rows)

Настройки сервера:
max_connections = 1000
shared_buffers = 64GB
effective_cache_size = 195072MB
maintenance_work_mem = 2GB
checkpoint_completion_target = 0.7
wal_buffers = 16MB
default_statistics_target = 100
random_page_cost = 1.1
effective_io_concurrency = 200
work_mem = 256MB
min_wal_size = 2GB
max_wal_size = 8GB
max_worker_processes = 24
max_parallel_workers_per_gather = 4
max_parallel_workers = 24
max_parallel_maintenance_workers = 4
checkpoint_timeout = 1h

Возможно стоит поменять какие-то настройки пг? Пробовал играться с work_mem поднимая до 512мб - но ситуация не менялась
...
Рейтинг: 0 / 0
Ускорить запрос
    #40051947
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Strikie,

postgresql крайне отрицательно относится к OR условиям в запросах...
попробуйте переписать запрос например как

Код: plsql
1.
2.
3.
select * from Transactions T, DebitTokens D, CreditTokens C where (T.ID = D.ID) and (T.ID = C.ID) and (C_Agreement in (38558956, 38558956))
UNION
select * from Transactions T, DebitTokens D, CreditTokens C where (T.ID = D.ID) and (T.ID = C.ID) and (D_Agreement in (38558956, 38558956))



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

потом можно будет еще несколько оптимизировать запрос при необходимости.


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Ускорить запрос
    #40051984
Strikie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk, благодарю за оперативность. Проверил на базе - запрос в 3 раза быстрее выполняется
...
Рейтинг: 0 / 0
Ускорить запрос
    #40051986
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Strikie
Maxim Boguk, благодарю за оперативность. Проверил на базе - запрос в 3 раза быстрее выполняется


как то маловата разница...
индексы по полям C_Agreement и D_Agreement есть то в базе?

я ожидал разницы в 1000 раз хотя бы...



--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Ускорить запрос
    #40051993
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не очень понятно, у Вас 10 баз, жалуетесь Вы на iowait который иногда случается, а грешите на запрос, который выполняется 600мс.
...
Рейтинг: 0 / 0
Ускорить запрос
    #40051995
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Guzya
Не очень понятно, у Вас 10 баз, жалуетесь Вы на iowait который иногда случается, а грешите на запрос, который выполняется 600мс.


если на каждой из 10 баз начнет кто то писать по 20-50mb временных файлов на запрос то iowait как раз и будет большим.
особенно если дисковая система слабая (а для 10Gb баз она скорее всего слабая так как нет смысла хорошую ставить)


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Ускорить запрос
    #40052002
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk
Guzya
Не очень понятно, у Вас 10 баз, жалуетесь Вы на iowait который иногда случается, а грешите на запрос, который выполняется 600мс.


если на каждой из 10 баз начнет кто то писать по 20-50mb временных файлов на запрос то iowait как раз и будет большим.
особенно если дисковая система слабая (а для 10Gb баз она скорее всего слабая так как нет смысла хорошую ставить)


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru


Это я понимаю, но почему именно этот запрос?

Т.е. :
10 баз одинаковые ?
Вся нагрузка к этим базам состоит из этого запроса?
Как определили, что временный файл создался именно этим запросом?

На счет
Maxim Boguk
(а для 10Gb баз она скорее всего слабая так как нет смысла хорошую ставить)


Судя по настройкам, на сервере ~200Гб оперативы.
...
Рейтинг: 0 / 0
Ускорить запрос
    #40052009
Strikie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk, индексов не было. Добавил для теста и вот что получил:

Это старый запрос:
"Gather (cost=30891.98..54785.63 rows=204 width=648) (actual time=690.605..749.054 rows=10 loops=1)"
" Workers Planned: 3"
" Workers Launched: 3"
" -> Nested Loop (cost=29891.98..53765.23 rows=66 width=648) (actual time=682.893..701.664 rows=2 loops=4)"
" -> Parallel Hash Join (cost=29891.55..53734.74 rows=66 width=568) (actual time=682.819..701.582 rows=2 loops=4)"
" Hash Cond: (d.id = c.id)"
" Join Filter: ((c.c_agreement = ANY ('{38558956,38558956}'::integer[])) OR (d.d_agreement = ANY ('{38558956,38558956}'::integer[])))"
" Rows Removed by Join Filter: 472560"
" -> Parallel Seq Scan on debittokens d (cost=0.00..22242.58 rows=609758 width=284) (actual time=0.018..70.371 rows=472562 loops=4)"
" -> Parallel Hash (cost=22269.58..22269.58 rows=609758 width=284) (actual time=280.334..280.336 rows=472562 loops=4)"
" Buckets: 2097152 Batches: 1 Memory Usage: 152640kB"
" -> Parallel Seq Scan on credittokens c (cost=0.00..22269.58 rows=609758 width=284) (actual time=0.019..76.657 rows=472562 loops=4)"
" -> Index Scan using pk_transactions on transactions t (cost=0.43..0.46 rows=1 width=80) (actual time=0.026..0.026 rows=1 loops=10)"
" Index Cond: (id = d.id)"
"Planning Time: 0.874 ms"
"Execution Time: 749.202 ms"


Это новый:

"HashAggregate (cost=791.09..793.13 rows=204 width=648) (actual time=0.293..0.309 rows=10 loops=1)"
" Group Key: t.id, t.amount, t.quantity, t.balanstypecls, t.classno, t.credit, t.debet, t.description, t.docdetail, t.document, t.eicls, t.finsource, t.firstnum, t.opdate, t.orgtypecls, t.params, t.parentid, t.userid, d.id, d.d_agreement, d.d_bankaccount, d.d_basedoc, d.d_calcrange, d.d_clselement, d.d_clsprogram, d.d_custom, d.d_deficitsource, d.d_depart, d.d_directioncls, d.d_estateadmin, d.d_expensekind, d.d_facialaccount, d.d_factcls, d.d_fintypecls, d.d_fss, d.d_functionalea, d.d_fundsmovement, d.d_gosprogramcls, d.d_incomeadmin, d.d_incomecode, d.d_incomeprice, d.d_incometype, d.d_information, d.d_jointstock, d.d_mediatype, d.d_monthrange, d.d_nbo, d.d_nestingtype, d.d_nfa, d.d_nfagroup, d.d_objaccount, d.d_organization, d.d_paytype, d.d_person, d.d_place, d.d_protectiontype, d.d_realaccount, d.d_regioncls, d.d_rendering, d.d_stateoperation, d.d_stateoperation2016, d.d_stdohrash, d.d_subkesr, d.d_subsidycls, d.d_targetcodecls, d.d_targetea, d.d_targetea2016, d.d_tipsummy, d.d_tiptseny, d.d_usercategory, d.d_vehicle, d.d_nomerpartii, d.d_nomerserii, d.d_srokgodnosti, d.d_budallocationcls, d.d_contractcostscls, d.d_ndsopcode, d.d_kodba, d.d_kindofcosts, d.d_targetfunds, d.d_tselycode, d.d_clselement125, d.d_estateadmin125, d.d_oktmo, d.d_recipientmc, d.d_statusnfa, d.d_tselevajafunktsija, d.d_ndo, d.d_actdir, c.id, c.c_agreement, c.c_bankaccount, c.c_basedoc, c.c_calcrange, c.c_clselement, c.c_clsprogram, c.c_custom, c.c_deficitsource, c.c_depart, c.c_directioncls, c.c_estateadmin, c.c_expensekind, c.c_facialaccount, c.c_factcls, c.c_fintypecls, c.c_fss, c.c_functionalea, c.c_fundsmovement, c.c_gosprogramcls, c.c_incomeadmin, c.c_incomecode, c.c_incomeprice, c.c_incometype, c.c_information, c.c_jointstock, c.c_mediatype, c.c_monthrange, c.c_nbo, c.c_nestingtype, c.c_nfa, c.c_nfagroup, c.c_objaccount, c.c_organization, c.c_paytype, c.c_person, c.c_place, c.c_protectiontype, c.c_realaccount, c.c_regioncls, c.c_rendering, c.c_stateoperation, c.c_stateoperation2016, c.c_stdohrash, c.c_subkesr, c.c_subsidycls, c.c_targetcodecls, c.c_targetea, c.c_targetea2016, c.c_tipsummy, c.c_tiptseny, c.c_usercategory, c.c_vehicle, c.c_nomerpartii, c.c_nomerserii, c.c_srokgodnosti, c.c_budallocationcls, c.c_contractcostscls, c.c_ndsopcode, c.c_kodba, c.c_kindofcosts, c.c_targetfunds, c.c_tselycode, c.c_clselement125, c.c_estateadmin125, c.c_oktmo, c.c_recipientmc, c.c_statusnfa, c.c_tselevajafunktsija, c.c_ndo, c.c_actdir"
" -> Append (cost=1.28..709.49 rows=204 width=648) (actual time=0.047..0.217 rows=20 loops=1)"
" -> Nested Loop (cost=1.28..373.19 rows=108 width=648) (actual time=0.047..0.126 rows=10 loops=1)"
" -> Nested Loop (cost=0.85..323.79 rows=108 width=364) (actual time=0.033..0.079 rows=10 loops=1)"
" -> Index Scan using ix_credittokens_agreement on credittokens c (cost=0.43..39.23 rows=108 width=284) (actual time=0.020..0.031 rows=10 loops=1)"
" Index Cond: (c_agreement = ANY ('{38558956,38558956}'::integer[]))"
" -> Index Scan using pk_transactions on transactions t (cost=0.43..2.63 rows=1 width=80) (actual time=0.003..0.003 rows=1 loops=10)"
" Index Cond: (id = c.id)"
" -> Index Scan using pk_debittokens on debittokens d (cost=0.43..0.46 rows=1 width=284) (actual time=0.003..0.003 rows=1 loops=10)"
" Index Cond: (id = t.id)"
" -> Nested Loop (cost=1.28..333.24 rows=96 width=648) (actual time=0.041..0.088 rows=10 loops=1)"
" -> Nested Loop (cost=0.85..289.33 rows=96 width=364) (actual time=0.031..0.054 rows=10 loops=1)"
" -> Index Scan using ix_debittokens_agreement on debittokens d_1 (cost=0.43..35.41 rows=96 width=284) (actual time=0.026..0.029 rows=10 loops=1)"
" Index Cond: (d_agreement = ANY ('{38558956,38558956}'::integer[]))"
" -> Index Scan using pk_transactions on transactions t_1 (cost=0.43..2.65 rows=1 width=80) (actual time=0.001..0.001 rows=1 loops=10)"
" Index Cond: (id = d_1.id)"
" -> Index Scan using pk_credittokens on credittokens c_1 (cost=0.43..0.46 rows=1 width=284) (actual time=0.002..0.002 rows=1 loops=10)"
" Index Cond: (id = t_1.id)"
"Planning Time: 1.695 ms"
"Execution Time: 0.583 ms"
...
Рейтинг: 0 / 0
Ускорить запрос
    #40052011
Strikie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Guzya, на сервере 256гб. А запрос отловил включением log_temp_files=1.
...
Рейтинг: 0 / 0
Ускорить запрос
    #40052020
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Strikie,

как и ожидалось ускорение порядка 1000 раз.
"Execution Time: 749.202 ms"
vs
"Execution Time: 0.583 ms"

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Ускорить запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]