
Dmitry
12.09.2018
12:28:58
Единственный Сис Админ в отпуске без связи.
Выводы я сделал, но от этого легче не стало

Yaroslav
12.09.2018
12:34:43

Dmitry
12.09.2018
12:40:50

Google

Илья
12.09.2018
12:58:48
подскажите, как узнать установенную версию citus ?

Yaroslav
12.09.2018
13:01:47

Илья
12.09.2018
13:03:54

Vitaly
12.09.2018
13:54:33
Добрый день. Вопрос по postgis. Есть таблица с геометриями разных типов, нужно по ней искать пересечения. Как быть с коллекциями и чтобы работал индекс?Есть ли ещё варианты кроме добавления столбцов в таблицу с разбиением по типам?

Darafei
12.09.2018
13:55:32
а в чём проблема, что не работает из коробки?

Vitaly
12.09.2018
13:57:58
St_intersects ругаеться на коллекцию, приходиться делить запрос на коллекции и на не коллекции. Коллекцию разбиваю st dump, но тогда не работает индекс

Darafei
12.09.2018
14:06:02
покажи запрос и ошибку
хммм, и правда
заведи тикет?
https://trac.osgeo.org/postgis/

Terminator
12.09.2018
14:10:34
@aleserche будет жить. Поприветствуем!

Vitaly
12.09.2018
14:17:34
заведи тикет?
В описании st_intersect написано что не работает для коллекций если geometry

Darafei
12.09.2018
14:19:26
не будет тикета - не буду чинить :)

Google

Darafei
12.09.2018
14:20:42
будет тикет - может, ещё в 2.5 протащить успеем
Vitaly смотри, почнинилось
17:20:02 [postgis_reg] > select ST_Intersects('POLYGON((0 0, 10 10, 3 5, 0 0))', 'GEOMETRYCOLLECTION(POINT(10 10), LINESTRING(0 0, 3 3))');
┌───────────────┐
│ st_intersects │
├───────────────┤
│ t │
└───────────────┘
(1 row)
Time: 10,568 ms

Vitaly
12.09.2018
14:32:26

Darafei
12.09.2018
14:42:35

Aleksey
12.09.2018
14:50:06

Darafei
12.09.2018
14:53:40
знаем мы такое, сначала тикет не заведут, потом спасибо не скажут

Dmitry
12.09.2018
15:00:26

Alexander
12.09.2018
15:06:52
а ведь так и не сказал!)
и тикет не завел

Vitaly
12.09.2018
15:09:37

Darafei
12.09.2018
15:20:12
перебори себя и заполни формочку регистрации в пять полей

Vitaly
12.09.2018
15:45:30

Darafei
12.09.2018
17:10:24
мне очень нравится фикс: https://github.com/postgis/postgis/pull/297/files#diff-978bce4984e620a04ff984c6c12d0776L2151

Vitaly
12.09.2018
17:22:40

Михаил
12.09.2018
17:26:27
Я что-то упустил или каждый вновь входящий должен за минуту решить, готов он куда-то пойти с терминатором или нет? ?

Alexey
12.09.2018
17:55:37

Tolya
12.09.2018
18:39:49

Dmitry
12.09.2018
18:39:57

Google

Михаил
12.09.2018
18:43:39
Антиспам-бот)
Он обычно как-то позитивно настроен, приветствует. А тут прям суров... не в духе похоже был)

Terminator
12.09.2018
19:00:26
@Kazakbala будет жить. Поприветствуем!

Kazakbala
12.09.2018
19:49:06
Всем привет. Кто может подсказать с выбором решения. Есть таблица (на текущий момент 288млн записей) которая хранит историю изменений учётной единицы. Учётные единицы хранятся в отдельной таблице. Их 26млн. В среднем на 1 приходится 10 записей истории.
Поиск по истории не ведётся, лишь просмотр всего списка и по родительскому айди (штрих код)
Думаем оптимизировать путем деления на partition. И второй путь хранить все изменения в jsonb.
При partition кол-во записей останется.
При jsonb будет 1к1.
Посоветуйте какой из двух методов выбрать.
Приклад на Java(hybernate)

Fike
12.09.2018
19:50:47
какова исходная причина оптимизации?

Darafei
12.09.2018
19:51:31
какое ожидается изменение от партиционирования?

Kazakbala
12.09.2018
19:53:47
Из-за большого объёма данных медленнее стали работать выборки. Но не так критично.

Yaroslav
12.09.2018
20:00:44

Kazakbala
12.09.2018
20:03:53
Завтра попробую скинуть план запроса (explain
На практике, в каких случаях можно применять partition?
Ищу подсказку - стоит ли игра свеч.

Volodymyr Kostyrko
12.09.2018
20:13:06
Ну например делить по месяцам удобно с точки зрения удаления.

Kazakbala
12.09.2018
20:14:19
А если записи никогда не удаляются?

Volodymyr Kostyrko
12.09.2018
20:14:28
Или когда большинство запросов всё равно считают относительно месяца.
Представьте что одно из условий в селекте стало физическим и вы добавляя его автоматически переходите к работе с меньшей таблицей с релевантными данными.

Darafei
12.09.2018
20:18:08
ну, это же в принципе сделает brin

Kazakbala
12.09.2018
20:18:19
Из таблицы селект в 90% только по общему ключу штрихкоду
Почитал комментарии на SO.
--------
Partitions do NOT help here. Ok, here is the issue - partitions help you to search less data, but using an index with the segment_id as first field and filtering by this one - does exactly the same. Enough RAM and FAST IO are the only solution to fast reading in data. Partitions are basically a "delete one partition fast" thing - anything else gets at best a small gain.

Yaroslav
12.09.2018
20:35:32
На практике, в каких случаях можно применять partition?
Для maintenance, в основном.
В плане производительности тоже можно выиграть, кстати, но нужно чётко понимать, почему, и использовать только в этих случаях.
Потому что, в противном случае, потеряете много времени только ради того, чтобы стало хуже. :(

Google

Vitaly
12.09.2018
23:22:44

Mike Chuguniy
13.09.2018
01:09:39


Dmitry
13.09.2018
04:24:56
Доброе утро, помогите, пожалуйста понять логику PG в части использования Index cond
=> \d+ model_oku
Таблица "public.model_oku"
Столбец | Тип | Модификаторы | Хранилище | Цель для статистики | Описание
---------------+------------------------+---------------------------------+-----------+---------------------+----------
year_month | character varying(10) | NOT NULL | extended | |
code_supplier | character varying(25) | NOT NULL | extended | |
account | character varying(25) | NOT NULL | extended | |
house_code | character varying(25) | NOT NULL | extended | |
unit_number | character varying(5) | DEFAULT NULL::character varying | extended | |
service | character varying(255) | NOT NULL | extended | |
charge | numeric(12,4) | NOT NULL DEFAULT 0 | main | |
accident | numeric(12,4) | NOT NULL DEFAULT 0 | main | |
underpayment | numeric(12,4) | NOT NULL DEFAULT 0 | main | |
overpayments | numeric(12,4) | NOT NULL DEFAULT 0 | main | |
facilities | numeric(12,4) | NOT NULL DEFAULT 0 | main | |
subsidies | numeric(12,4) | NOT NULL DEFAULT 0 | main | |
offered | numeric(12,4) | NOT NULL DEFAULT 0 | main | |
paid | numeric(12,4) | NOT NULL DEFAULT 0 | main | |
amount_debt | numeric(12,4) | NOT NULL DEFAULT 0 | main | |
file_source | character varying(20) | NOT NULL | extended | |
period_code | integer | NOT NULL | plain | |
service_id | integer | | plain | |
Индексы:
"model_oku_account_idx" btree (account)
"model_oku_file_source_idx" btree (file_source)
"model_oku_period_code_idx" btree (period_code)
"model_oku_service_id_period_code_idx" btree (service_id, period_code)
"model_oku_year_month_idx" btree (year_month)
Параметры: autovacuum_enabled=true
=> explain analyze SELECT MAX(period_code) AS code FROM model_oku WHERE account='1040349-Г1';
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Result (cost=414.88..414.89 rows=1 width=4) (actual time=1780.896..1780.896 rows=1 loops=1)
InitPlan 1 (returns $0)
-> Limit (cost=0.43..414.88 rows=1 width=4) (actual time=1780.893..1780.893 rows=0 loops=1)
-> Index Scan Backward using model_oku_period_code_idx on model_oku (cost=0.43..903481.92 rows=2180 width=4) (actual time=1780.892..1780.892 rows=0 loops=1)
Index Cond: (period_code IS NOT NULL)
Filter: ((account)::text = '1040349-Г1'::text)
Rows Removed by Filter: 6510952
Planning time: 0.211 ms
Execution time: 1780.926 ms
т.е. для меня удивительно почему выбрано условие (period_code IS NOT NULL)
pg 9.6.9


Andrei
13.09.2018
04:39:17
чтобы исключить из перебора ветвь индекса с нуловым period_code
Т.к. наличие записи с пустым period_code имеет тот же результат, что и ее отсутствие

Dmitry
13.09.2018
05:02:04
ну и в результате просматривается вся таблица

Yaroslav
13.09.2018
06:34:21
ну и в результате просматривается вся таблица
С виду, тут обычное дело — планировщик рискнул и... проиграл. :(
Можете показать оценки (только rows из самого верхнего node) для:
EXPLAIN SELECT * FROM model_oku;
EXPLAIN SELECT * FROM model_oku WHERE account='1040349-Г1';
EXPLAIN SELECT DISTINCT peridod_code FROM model_oku;
?

Dmitry
13.09.2018
06:37:25

Andrei
13.09.2018
06:37:48
вобщем, вот этот - “model_oku_account_idx" btree (account) - индекс относительно бесполезный в вашем случае

Yaroslav
13.09.2018
06:40:05

Александр
13.09.2018
06:40:08
Если без индекса

Dmitry
13.09.2018
06:40:57
explain analyze SELECT MAX(period_code) AS code FROM model_oku;
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Result (cost=0.46..0.47 rows=1 width=4) (actual time=0.017..0.017 rows=1 loops=1)
InitPlan 1 (returns $0)
-> Limit (cost=0.43..0.46 rows=1 width=4) (actual time=0.015..0.015 rows=1 loops=1)
-> Index Only Scan Backward using model_oku_period_code_idx on model_oku (cost=0.43..180232.60 rows=6614295 width=4) (actual time=0.015..0.015 rows=1 loops=1)
Index Cond: (period_code IS NOT NULL)
Heap Fetches: 0
Planning time: 0.098 ms
Execution time: 0.033 ms

Andrei
13.09.2018
06:41:32
если запрос выше - регулярный, то делайте индекс по account и period_code

Yaroslav
13.09.2018
06:42:40

Dmitry
13.09.2018
06:44:26

Google

Andrei
13.09.2018
06:45:10
а эксплейните такое
SELECT period_code AS code FROM model_oku WHERE account='1040349-Г1' ORDER BY 1 DESC LIMIT 1;

Yaroslav
13.09.2018
06:46:21

Dmitry
13.09.2018
06:46:50
а эксплейните такое
Limit (cost=0.43..753.92 rows=1 width=4) (actual time=1679.578..1679.578 rows=0 loops=1)
-> Index Scan Backward using model_oku_period_code_idx on model_oku (cost=0.43..643476.96 rows=854 width=4) (actual time=1679.576..1679.576 rows=0 loops=1)
Filter: ((account)::text = '1040349-Г1'::text)
Rows Removed by Filter: 6510952
Planning time: 0.134 ms
Execution time: 1679.599 ms

Andrei
13.09.2018
06:46:50

Dmitry
13.09.2018
06:51:22
https://pastebin.com/9bLWfYep
select count(1) from (select distinct account from model_oku) _; возвращает 12234, по-моему нормальная селективность по account

Yaroslav
13.09.2018
06:54:24

Dmitry
13.09.2018
07:04:19
Спасибо, скоро посмотрю...
Вам спасибо. если в запросе указан account которого нет в таблице и сам запрос выполняется относительно долго. но вот если поискать по account который в таблице есть, то запрос начинает работать за приемлемое время https://pastebin.com/rD1RYxJ5

Andrei
13.09.2018
07:07:46
>>но вот если поискать по account который в таблице есть, то запрос начинает работать за приемлемое время
Вы же понимаете, что это частный случай?