
Tolya
18.01.2018
12:06:45
индексы разные, да
второй индекс вроде даже более селективный судя по плану и идет index only скан, а на деле он просто умирает на запросе

Mike Chuguniy
18.01.2018
12:07:43

Tolya
18.01.2018
12:07:50
кроме составных индексов на этой таблице есть еще отдельные индексы на uid, отдельные на bar_number и lower(bar_number)

andrey
18.01.2018
12:08:44

Google

Yaroslav
18.01.2018
12:12:57

Dmitriy
18.01.2018
12:13:14

Yaroslav
18.01.2018
12:13:36

Dmitriy
18.01.2018
12:13:56
на будущее, чтобы шустрее работало

Yaroslav
18.01.2018
12:14:28

Mike Chuguniy
18.01.2018
12:15:00
А зачем?
У человека 2Гб оперативы на виртуалке. Вот он и изощряется, чтобы такого придумать...

Dmitriy
18.01.2018
12:15:21
поиск впределах маленькой партиции быстрее работает, чем в толстой таблице

Yaroslav
18.01.2018
12:15:39

Dmitriy
18.01.2018
12:16:33
дык я там после написал: 16ГБ данных, а индексов на 53ГБ

Yaroslav
18.01.2018
12:17:38

Konstantin
18.01.2018
12:17:38

Mike Chuguniy
18.01.2018
12:18:21
@dmitriy_vasilyev приключения - это здорово. Но быстро надоедает. Поэтому рекомендация в вашем случае правильная только одна - нарастить оперативы. Партиционировать 50 гб - это вот как-то не совсем понятно. Ну и когда данных 16 Гб, а индексов - 53 - это вызывает много вопросов.

Google

Yaroslav
18.01.2018
12:18:26

Dmitriy
18.01.2018
12:18:59

Yaroslav
18.01.2018
12:20:01

Dmitriy
18.01.2018
12:20:43
да

Mike Chuguniy
18.01.2018
12:20:52
Занчит надо разбираться, что за индексы, и где они используются. Ибо с таким соотношением любой запрос будет тормозить на этапе планирования. А ещё у вас наверняка весёлое веселье при любом изменении данных.

Konstantin
18.01.2018
12:20:53

Yaroslav
18.01.2018
12:21:47
да
Тогда, опять-таки, зачем партиционировать? По сравнению с корректной индексацией никакого выигрыша, скорее всего, не будет.
А вот проиграть можно запросто.

Dmitriy
18.01.2018
12:23:03
На партиции нормально же индексы вешаются, не?
И в таблицах много insert и редко делаются селекты
иногда delete делается

Mike Chuguniy
18.01.2018
12:24:17
@dmitriy_vasilyev на Ваших объёмах любое партиционирование будет увеличивать количество проблем.

Dmitriy
18.01.2018
12:24:29
это данные за пол года.
А копить и хранить нужно около 5-6

Yaroslav
18.01.2018
12:28:48

Dmitriy
18.01.2018
12:29:44
а мне uniq не нужен

Mike Chuguniy
18.01.2018
12:29:56
16*6 = 96 Не, не надо такие объёмы партиционировать. А вот с индексами разбираться надо. Потому что реальная ситуация, когда размер индекса сопоставим с объёмом данных - это на индексах для полнотекстового поиска. Но чтобы объём индекса более чем в 3+ раза превышал объём данных... Не, в голове укладывается плохо.

Аггей
18.01.2018
12:30:48

Yaroslav
18.01.2018
12:31:38
а мне uniq не нужен
Я просто хотел Вас предупредить, что Вы можете просто потратить много времени (на партиционирование и его тестирование) абсолютно впустую (т.е. в конце убедиться, что стало только хуже).

Google

Yaroslav
18.01.2018
12:33:55

Mike Chuguniy
18.01.2018
12:34:58

Аггей
18.01.2018
12:36:38

Yaroslav
18.01.2018
12:37:17

Mike Chuguniy
18.01.2018
12:38:24

Dmitriy
18.01.2018
12:38:56

Yaroslav
18.01.2018
12:39:43

Dmitriy
18.01.2018
12:40:07
Это не \d. Интересуют именно индексы, ясное дело. ;)
CREATE INDEX stat_inside_ip_idx
ON public.flowlog
USING btree
(insideip, timestart, timeend);
— Index: public.stat_out_ip_idx
— DROP INDEX public.stat_out_ip_idx;
CREATE INDEX stat_out_ip_idx
ON public.flowlog
USING btree
(outsideip, timestart, timeend);
CREATE INDEX active_idx
ON public.flowlog
USING btree
(timeend);
вот 3 индекса

Yaroslav
18.01.2018
12:41:30
вот 3 индекса
И всё, только 3?
Кстати, почему у Вас "timestart integer," а не timestamptz?

Dmitriy
18.01.2018
12:42:02
исторически сложилось, дату хранить в unix формате

Аггей
18.01.2018
12:42:43
Уникальность значений высокая... в составных индексах я думаю вообще каждая строка уникальна

Dmitriy
18.01.2018
12:43:14
-+ да, каждая

Yaroslav
18.01.2018
12:43:28

Dmitriy
18.01.2018
12:43:36
по timestart

Mike Chuguniy
18.01.2018
12:45:12
Что-то мне подсказывает, что timeend из составных индексов надо попробовать убрать при наличии отдельного индекса по этому полю. Может я и не прав, утверждать не буду. Но я бы попробовал.

Dmitriy
18.01.2018
12:45:40
в условиях запросов используются все 3 поля

Yaroslav
18.01.2018
12:46:35
по timestart
На первый взгляд (судя по индексам) станет хуже (или же эти индексы к Вашим запросам не очень подходят).

Dmitriy
18.01.2018
12:47:03
сейчас все работает нормально, шустро ищет все, что нужно

Google

Yaroslav
18.01.2018
12:47:11

Аггей
18.01.2018
12:47:26

Dmitriy
18.01.2018
12:50:57
select to_timestamp(timestart)::timestamp without time zone as timestart,to_timestamp(max(timeend))::timestamp without time zone as timeend,insideip as internalip,outsideip as externalip,startport,endport from flowlog
where
(timeend = 0 or timeend >= $tf) and timestart <= $tt and $sideIP = '$ip'::inet
group by timestart, insideip, outsideip, startport, endport "
order by timestart,insideip,outsideip

Yaroslav
18.01.2018
12:52:22

Dmitriy
18.01.2018
12:52:31
$ip = это ip
$tf = time from (unix)
$tt = time to (unix)
$side = insideip / outsideip

Аггей
18.01.2018
12:55:01
Как видите, нет.
Да. Вижу. Секционирование при высокой уникальности значений думаю не поможет - у вас и так каждый индекс указывает на 1 строку таблицы - зачем?
Сорри поглядел запрос )

Kolya
18.01.2018
12:56:47
Привет всем, есть такой вопрос как посчитать максимально количество коннектов к pgbouncer, от каких параметров это зависит?

Yaroslav
18.01.2018
12:57:17
select to_timestamp(timestart)::timestamp without time zone as timestart,to_timestamp(max(timeend))::timestamp without time zone as timeend,insideip as internalip,outsideip as externalip,startport,endport from flowlog
where
(timeend = 0 or timeend >= $tf) and timestart <= $tt and $sideIP = '$ip'::inet
group by timestart, insideip, outsideip, startport, endport "
order by timestart,insideip,outsideip
Для выполнения этого запроса придётся проверить все partitions, где timestart меньше заданного, и в каждой произвести поиск по индексу. Если $tt у Вас обычно ближе к "концу", то почти все. Даже теоретически, Вы заменяете одно сканирование индекса (по insideip/outsideip и timestart) на K сканирований (где K —- кол-во partitions). Плюс ещё время планирования.
Т.е. запрос станет (значительно?) менее шустрым. ;)

Dmitriy
18.01.2018
12:58:15
Хорошо, спасибо за разъяснения
пускай будет толстая таблица, жить не мешает

Andrey
18.01.2018
13:08:03
Если данные более или менее равномерно распределены по времени, можно разбить на партиции по timestart. Но тогда каждый запрос должен содержать условие, чтобы захватить конкретную партицию. При таком подходе я вижу больше плюсов, чем минусов. Во-первых, сами индексы будут меньше - они могут целиком поместиться в кеш. Ну это при услови, что есть данные, попадающие в интервал времени, с котороыми вы чаще работаете, чем с другими. Во-вторых, таблицы будет проще обслуживать - быстрее создавать индексы, делать ALTER и так далее. В-третьих - VACUUM. Он хотя бы сможет отработать на маленьких таблицах.

kino
18.01.2018
13:14:24
Добрый день как с эмулировать тип set mysql https://dev.mysql.com/doc/refman/5.7/en/set-statement.html

Alexey
18.01.2018
13:16:35
только ссылка не про тип set

Denis
18.01.2018
13:17:10
(insideip, timestart, timeend);
по-моему, timeend - в этом индексе только место занимает

Yaroslav
18.01.2018
13:17:40
Если данные более или менее равномерно распределены по времени, можно разбить на партиции по timestart. Но тогда каждый запрос должен содержать условие, чтобы захватить конкретную партицию. При таком подходе я вижу больше плюсов, чем минусов. Во-первых, сами индексы будут меньше - они могут целиком поместиться в кеш. Ну это при услови, что есть данные, попадающие в интервал времени, с котороыми вы чаще работаете, чем с другими. Во-вторых, таблицы будет проще обслуживать - быстрее создавать индексы, делать ALTER и так далее. В-третьих - VACUUM. Он хотя бы сможет отработать на маленьких таблицах.
Вы пример запроса видели? Нет там условия для конкретной partition, он захватывает несколько (а, возмжно, почти все). :(

Denis
18.01.2018
13:17:43
если вы с timestart не равенством сравниваете, timeend не используется никогда

Аггей
18.01.2018
13:18:14
Если данные более или менее равномерно распределены по времени, можно разбить на партиции по timestart. Но тогда каждый запрос должен содержать условие, чтобы захватить конкретную партицию. При таком подходе я вижу больше плюсов, чем минусов. Во-первых, сами индексы будут меньше - они могут целиком поместиться в кеш. Ну это при услови, что есть данные, попадающие в интервал времени, с котороыми вы чаще работаете, чем с другими. Во-вторых, таблицы будет проще обслуживать - быстрее создавать индексы, делать ALTER и так далее. В-третьих - VACUUM. Он хотя бы сможет отработать на маленьких таблицах.
Я в свое время секционировал таблицы zabbix (по itemid) как раз с целью сокращения времени vacuum (особенно autovacuum), и там в каждом запросе содержится 1 либо несколько конкретных itemid - как раз под ваши рекомендации. Профит есть

Google

Yaroslav
18.01.2018
13:19:27

Аггей
18.01.2018
13:20:11
Я делал на 9.6, сейчас там уже 10ка... но по-прежнему pg_pathman

Dmitriy
18.01.2018
13:20:13
Если данные более или менее равномерно распределены по времени, можно разбить на партиции по timestart. Но тогда каждый запрос должен содержать условие, чтобы захватить конкретную партицию. При таком подходе я вижу больше плюсов, чем минусов. Во-первых, сами индексы будут меньше - они могут целиком поместиться в кеш. Ну это при услови, что есть данные, попадающие в интервал времени, с котороыми вы чаще работаете, чем с другими. Во-вторых, таблицы будет проще обслуживать - быстрее создавать индексы, делать ALTER и так далее. В-третьих - VACUUM. Он хотя бы сможет отработать на маленьких таблицах.
там запросы максимум за сутки

Yaroslav
18.01.2018
13:20:28

Andrey
18.01.2018
13:20:32

Yaroslav
18.01.2018
13:23:03

Dmitriy
18.01.2018
13:24:56
Я планировал помесячно разбить. Выборки максмум за сутки, чаще всего в пределах часа-двух

Evgeny
18.01.2018
13:25:22
Подскажите, есть у кого словать для Thesaurus чтобы сделать поиск по синонимам?

Yaroslav
18.01.2018
13:27:01

Dmitriy
18.01.2018
13:28:41
Задача такакя: дается ip и период. Мне нужны все записи, которые попадают в заданный интвервал. timestart - timeend. И при этом timeend может быть = 0, типа сессия активна

Andrey
18.01.2018
13:33:45

Yaroslav
18.01.2018
13:34:56

Dmitriy
18.01.2018
13:39:18
Ну пока работает
я думал что дальше делать, если начнет тупить, еще раз тут спрошу, может пг 11 уже будет))

Yaroslav
18.01.2018
13:42:00

Dmitriy
18.01.2018
13:42:15
тут выше уповали на нее
типа pg_pathman не нужен будет
и заживем