@pgsql

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

Mike Chuguniy
18.01.2018
12:07:43
всем привет, что посоветуете почитать для освоения сложных select с join, я сейчас попал на проект с аналитикой metabase + postgres
Селекты с джойнами - это не сложно. Официальной документации вполне себе хватает. Суровая аналитика без CTE - это как-то вот в голове плохо укладывается. А CTE - это искать в гугле всю и всяческую оптимизацию запросов от Максима Богука и Ивана Фролкова.

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

Google
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
дык я там после написал: 16ГБ данных, а индексов на 53ГБ
А Вы что думате, после партиционирования меньше будет?

Konstantin
18.01.2018
12:17:38
А почему Вы вообще rule используете?
а что в таких случаях триггер используют? ну я уже логику програмки поменял, чтоб все были записи уникальные

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

Google
Yaroslav
18.01.2018
12:18:26
а что в таких случаях триггер используют? ну я уже логику програмки поменял, чтоб все были записи уникальные
Rule лучше вообще не использовать, никогда. См. http://blog.rhodiumtoad.org.uk/2010/06/21/the-rule-challenge/

Yaroslav
18.01.2018
12:20:01
несколько жирных составных индексов там.
Если они были нужны и "исчезнут" после партиционирования, производительность исчезнет вместе с ними, Вы это понимаете? ;)

Dmitriy
18.01.2018
12:20:43
да

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

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
Ну собственно эти индексы и сделаны для запросов. Все норм работает. Просто за счет партицирования хочу, что бы искались значения не в толстой таблице, а в маленьком кусочк.
Ещё раз: почему Вы думате, что будет лучше? Вы, кстати, знаете про ограничения, т.е. хотя бы то, что дата/даты должны быть константами в запросе?

На партиции нормально же индексы вешаются, не?
Да. Но "общий" UNIQUE INDEX Вы уже не сделаете, например.

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
Да. Но "общий" UNIQUE INDEX Вы уже не сделаете, например.
Общий индекс вообще не сделаете - глобальный и это самый большой недостаток партиционирования

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

Google
Mike Chuguniy
18.01.2018
12:34:58
Просто индексов там много, как я понял.
Их там не много. Их там чудовищно много.

Аггей
18.01.2018
12:36:38
Их там не много. Их там чудовищно много.
Тут надо видеть таблицу - может узкая и с большим числом уникальных значений

Yaroslav
18.01.2018
12:37:17
а мне uniq не нужен
А можете \d таблицы показать, в самом деле?

Mike Chuguniy
18.01.2018
12:38:24
Тут надо видеть таблицу - может узкая и с большим числом уникальных значений
Видеть одну таблицу - сильно мало. Надо ещё знать задачи. И товарищ уже говорил, что многоразвесистых составных индексов.

Dmitriy
18.01.2018
12:38:56
А можете \d таблицы показать, в самом деле?
CREATE TABLE public.flowlog ( timestart integer, timeend integer, insideip inet, outsideip inet, startport integer, endport integer )

Yaroslav
18.01.2018
12:39:43
CREATE TABLE public.flowlog ( timestart integer, timeend integer, insideip inet, outsideip inet, startport integer, endport integer )
Это не \d. Интересуют именно индексы, ясное дело. ;)

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
исторически сложилось, дату хранить в unix формате
Ну ладно, а по какому полю Вы её думали партиционировать? По timeend? Если так, то, судя по другим индексам, у Вас как раз вариант "станет только хуже".

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
в условиях запросов используются все 3 поля
Можете примеры запросов показать?

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
Сейчас у него indexonly scan
Как видите, нет.

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 - в этом индексе только место занимает

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

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

Yaroslav
18.01.2018
13:20:28
если вы с timestart не равенством сравниваете, timeend не используется никогда
Почему это? В индексе-то оно есть, там же и должно использоваться... толк должен быть.

Andrey
18.01.2018
13:20:32
Вы пример запроса видели? Нет там условия для конкретной partition, он захватывает несколько (а, возмжно, почти все). :(
Видел, из него не совсем понятно, какова селективность. Просто я не могу поверить, что где-то может существовать большая таблица которую нужно постоянно целиком сканировать. В таком случае надо пересмотреть немного архикектуру. Может, агрегировать что-то предварительно.

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
Я планировал помесячно разбить. Выборки максмум за сутки, чаще всего в пределах часа-двух
В Вашем примере запроса условия-то не такие... Выбираются все записи с timestart <= $tt .

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
Задача такакя: дается ip и период. Мне нужны все записи, которые попадают в заданный интвервал. timestart - timeend. И при этом timeend может быть = 0, типа сессия активна
Хмм... я почти уверен, что Ваши запросы на самом деле "спасает" наличие AND $sideIP = '$ip'::inet и соотвествующий индекс по нему (т.е. то, что записей по одному IP в среднем немного), а не что-то другое.

Dmitriy
18.01.2018
13:39:18
Ну пока работает

я думал что дальше делать, если начнет тупить, еще раз тут спрошу, может пг 11 уже будет))

Dmitriy
18.01.2018
13:42:15
тут выше уповали на нее

типа pg_pathman не нужен будет

и заживем

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