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

Wom
04.04.2017
15:47:49

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

Alexander
04.04.2017
15:48:08

Google

Anton
04.04.2017
15:48:19

Alexander
04.04.2017
15:51:08
как?
как это делать?) в Датагрипе выделить 2 схемы и нажать Ctrl + D
на идентичные сиквенсы он конечно ругается, но это мелочь, как мне кажется. Не очень приятная, но мелочь.

Wom
04.04.2017
15:52:39

Anton
04.04.2017
15:55:51


Алексей
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

Denis
05.04.2017
10:12:48

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
мы не можем здесь сортировать по индексу, сортировка по полям из разных таблицы.

Andrey
05.04.2017
10:32:43
https://www.postgresql.org/docs/current/static/sql-cluster.html

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

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?
чтобы второй раз сортировать уже скорее-всего-сортированное