@pgsql

Страница 292 из 1062
Anton
04.04.2017
15:47:32
DataGrip потаблично можно, навикат не пробовал, сейчас гляну

Anton
04.04.2017
15:48:02
вариантов в гугле море :) интересует кто что исползьует, чтоб наверняка

Alexander
04.04.2017
15:48:08
DataGrip потаблично можно, навикат не пробовал, сейчас гляну
все диффы можно вывести одним скопом скриптов, предварительно выбрав что и куда надо мигрировать

Google
Anton
04.04.2017
15:48:19
Alexander
04.04.2017
15:51:08
как?
как это делать?) в Датагрипе выделить 2 схемы и нажать Ctrl + D

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

Алексей
05.04.2017
05:56:23
Всем доброго утра. С недавних пор начала возникать проблема обрыва стрима (VCLib.Common.ProcessException: Ошибка исполнения на сервере ---> VCLib.Common.ProcessException: Ошибка работы с базой данныхException while reading from stream в Npgsql.ReadBuffer.Ensure(Int32 count, Boolean dontBreakOnTimeouts) в Npgsql.NpgsqlConnector.DoReadMessage(DataRowLoadingMode dataRowLoadingMode, Boolean isPrependedMessage) в Npgsql.NpgsqlConnector.ReadMessageWithPrepended(DataRowLoadingMode dataRowLoadingMode) в Npgsql.NpgsqlConnector.ReadExpecting[T]() в Npgsql.NpgsqlDataReader.NextResultInternal() в Npgsql.NpgsqlDataReader.NextResult() в Npgsql.NpgsqlCommand.Execute(CommandBehavior behavior) в Npgsql.NpgsqlCommand.ExecuteDbDataReaderInternal(CommandBehavior behavior) в Npgsql.NpgsqlCommand.ExecuteDbDataReader(CommandBehavior behavior) в System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader() ) в начале грешил на запрос, но ошибка начала валится совсем в разных запросах, вопрос. могут ли влиять какие то настройки постгреса на возникновение данной ошибки

Alex
05.04.2017
08:31:18
Доброго времени суток , есть SELECT который с ORDER BY выполняется очень долго без него быстро, помогите пожалуйста оптимизировать его. Индексы стоят на поля. Выборка : https://pastebin.com/UWNrxgc9 План с ORDER BY : https://pastebin.com/jeERrwSg План без ORDER BY : https://pastebin.com/5mbuS6rN MAX длина ss.name : 26 , rp.name(80)

Andrey
05.04.2017
08:33:10
Планы, конечно, удобнее в https://explain.depesz.com/ смотреть.

А индексы какие именно?

У вас всё время просто сортировка занимает, потому и долго. Нужен упорядоченный индекс. Можно ещё данные кластеризовать по индексу в таблице, будет ещё быстрее. https://www.postgresql.org/docs/9.6/static/indexes-ordering.html

Попробуйте NULLS LAST добавить к запросу.

Alex
05.04.2017
08:38:00
перезалил план 1 : https://explain.depesz.com/s/KVxj план 2 : https://explain.depesz.com/s/I2C

я забыл уточнить что inno_paymentreport VIEW но выборка оттуда быстрая

Google
Alex
05.04.2017
08:40:54
попробую index переделать на NULL LAST

Andrey
05.04.2017
08:41:49
Он по умолчанию такой.

Что у вас за машина? У вас 20 тысяч строк в памяти 30 секунд сортируются. Что-то долго.

Alex
05.04.2017
08:46:11
top - 12:42:41 up 4 days, 3:34, 3 users, load average: 1.76, 1.33, 1.16 Tasks: 333 total, 2 running, 331 sleeping, 0 stopped, 0 zombie Cpu(s): 8.4%us, 0.1%sy, 0.0%ni, 90.6%id, 0.9%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 22538748k total, 18590524k used, 3948224k free, 554668k buffers Swap: 8388600k total, 32152k used, 8356448k free, 14529780k cached

Версия постгреса : 9.2 ,OS CentOS 6.5

Denis
05.04.2017
09:10:27
а можно \d res_partner и \d sale_shop ?

Alex
05.04.2017
09:11:50
https://pastebin.com/W0ipnL2N

У меня часто бывают проблемы с ORDER BY по таблице res_partner, например ORDER BY name или ORDER BY display_name

Denis
05.04.2017
09:19:21
и inno_paymentreport тоже посмотреть можно?

Alex
05.04.2017
09:20:25
там VIEW но выборка быстрая

Denis
05.04.2017
09:21:01
а сколько строк во вьюхе?

Alex
05.04.2017
09:22:48
288230

work_mem = 128MB shared_buffer = 3GB effective_cashe_size = 16GB autovacuum настроен

Denis
05.04.2017
09:25:14
смотрите, первое соображение, которое приходит - это использовать покрывающие индексы хотя бы в таблицах res_partner и sale_shop, чтобы не ходить их них в саму таблицу. для (id, name), чтобы за name не лезть в таблицу, в res_partner (id, date, name)

опечалатся, в sale_shop создать идекс (id, name), в res_partner - (id, date, name).и посмотреть, изменится ли скорость

Alex
05.04.2017
09:26:59
попробую

Denis
05.04.2017
09:28:26
Ну и перед выполнением обновить статистику

Alex
05.04.2017
09:30:35
поле day которое используется для between не находится в res_partner, он из другой таблицы с VIEW

Denis
05.04.2017
09:31:54
А по полю date из res_partner фильтрацию можно осуществить в запросе? Чем меньше данных мы поднимем с диска, теп быстрее будет запрос

Andrey
05.04.2017
09:32:47
Там в res_partner три поля типа bytea ещё.

Google
Andrey
05.04.2017
09:33:05
Хотя сама таблица небольшая.

Denis
05.04.2017
09:33:56
вроде же их не возвращает запрос, так что лежат и лежат себе в куче

Alex
05.04.2017
09:33:58
Denis к сожалению не можем

Denis
05.04.2017
09:34:27
ну ок, тогда выкидываем из покрывающего индекса дату и пробуем взлететь хотя бы с именами

Alex
05.04.2017
09:35:01
я попробовал без date все равно грустно

мб work_mem добавитЬ , но думаю он и так норм 128MB

Denis
05.04.2017
09:35:54
печаль, надо думать дальше, как уменьшить объем поднимаемых данных с диска и как бы индексы по-активнее попользвать

Alex
05.04.2017
09:36:01
без order by за 2 сек выполняется

Denis
05.04.2017
09:38:08
ну да, тогда к запросу самому вопросов нет. и индекс мы тоже не сможем использовать - сортировка по полям из двух разных таблиц

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

вот ему и плохо

Alex
05.04.2017
09:40:22
попробую , спасибо за идею

Alex
05.04.2017
10:01:41
убрал Bytea поля на тестовой базе с res_partner запрос выполняется 2x быстрее ,но все равно медленно 13973 ms

попробовад с res_partner выбрать только те поля которые мне нужно тоже нету профита select ss.name,rp.name,sum(partner_payed) as partner_payed,sum(cash_patient) as cash, sum(chg_patient) as chg, sum(transfer_patient) as transfer,sum(card_patient) as card,sum(cash_amount) as cash_amount from inno_paymentreport ip inner join (select id,name from res_partner) rp on rp.id=ip.partner_id inner join sale_shop as ss on ip.shop_id=ss.id where day between '2017-01-01' and '2017-04-05' group by ss.name,rp.name order by ss.name,rp.name

если только order by ss.name оставить тоже нету профита (в таблице ss 8 записей )

Denis
05.04.2017
10:05:40
А можно explain analyze?

Alex
05.04.2017
10:09:23
https://explain.depesz.com/s/2BDN

от запроса который написал выше

Denis
05.04.2017
10:11:24
Он те же 34 секунды сортирует при новом запросе. Мда

Alex
05.04.2017
10:12:28
этот запрос с реальной базы там есть bytea поля , дать с тестовой где их нет ?

Google
Admin
ERROR: S client not available

Alex
05.04.2017
10:14:09
https://explain.depesz.com/s/t9Lp

Denis
05.04.2017
10:25:26
with found_data as ( select ss.name as ss_name,rp.name as rp_name,sum(partner_payed) as partner_payed,sum(cash_patient) as cash, sum(chg_patient) as chg, sum(transfer_patient) as transfer,sum(card_patient) as card,sum(cash_amount) as cash_amount from inno_paymentreport ip inner join (select id,name from res_partner) rp on rp.id=ip.partner_id inner join sale_shop as ss on ip.shop_id=ss.id where day between '2017-01-01' and '2017-04-05' group by ss.name,rp.name ) select * from found_data order by ss_name, rp_name

вот такой запрос сколько?

Alex
05.04.2017
10:27:12
"Total runtime: 8960.856 ms"

Denis
05.04.2017
10:29:08
То есть 9 секунд. Выходит, тупит именно постгрес, подставляя в сортировку строки излишней длины

Alex
05.04.2017
10:31:27
да , ORDER BY со стрингами он часто тупит

мб что-нибудь изменилось в 9,6? нужно обновиться

Andrey
05.04.2017
10:31:55
Ему всё равно, строки или нет, если по индексу сортировать.

Мне кажется, причина в том, что таблица широкая просто.

Попробуйте кластиризовать по индексу.

Denis
05.04.2017
10:32:35
мы не можем здесь сортировать по индексу, сортировка по полям из разных таблицы.

Denis
05.04.2017
10:33:24
да и кластеризация только ускорит sequence scan, а у него проблема, что в памяти слишком широкая таблица лежит, ее тяжело вращать

Darafei
05.04.2017
10:35:19
collate c можно попробовать, если логика текстовой сортировки позволяет

Denis
05.04.2017
10:35:59
есть хитрый план на грани фола. можно dyfxfkt отсортировать объединение res_partner и sale_shop, а птом к результату приджойнить inno_paymentreport, но тут есть опасность. стандарт sql не гарантирует, что при таком кейсе она 100% придет отсортированным

Akzhan
05.04.2017
11:32:39
materialized view не поможет в вашем случае?

но вообще-то что не так не в запросе, а в способе хранения данных

Google
Akzhan
05.04.2017
11:34:35
по-хорошему вам там вообще непонятно зачем такая сортировка и группировка. логичнее выглядело бы два разных запроса

либо union

Alex
05.04.2017
11:40:01
@jin2red materialized view не можем использовать версия 9.2. Будем обновляться в ближайщее время . Кстати 9.6 уже актуальна или на 9.5 обновиться ?

Akzhan
05.04.2017
11:40:16
у нас в бою PostgreSQL 9.6.2

Fedor
05.04.2017
11:42:53
у нас в бою PostgreSQL 9.6.2
Сколько транзакций в пике ? Стабильна ?

Akzhan
05.04.2017
11:44:45
я не dba, так что цифр сходу не скажу ))) стабильна. но у нас нагрузка небольшая, и запросы тривиальны (включая выборку по jsonb и индексу по оному).

Denis
05.04.2017
12:03:28
@jin2red materialized view не можем использовать версия 9.2. Будем обновляться в ближайщее время . Кстати 9.6 уже актуальна или на 9.5 обновиться ?
Materialized view тут не помогут. У вас запрос без сортировки выполняется 2 секунды, если добавить order by, то 33. Проблем две. Первая, в плане запроса вначале все строки из inno_paymentreport с приджойненными двумя таблица вначале сортируется, потом только группируется. Сортировать приходится слишком много. Эта проблема решается через модификацию запроса, как я скинул с cte. Он выполняется уже 9 секунд. Значит, 7 секунд 30 тыс строк сортируются в памяти. Единственный вариант их ускорить - это уменьшить их энтропию. Я предлагаю пересоздать представление inno_paymentreport с сортировкой по shop_id и partner_id

Darafei
05.04.2017
12:08:47
там есть куда воткнуть два order by?

чтобы второй раз сортировать уже скорее-всего-сортированное

Страница 292 из 1062