|
Большие таблицы и индексы
|
|||
---|---|---|---|
#18+
Добрый день! задача такая: среди прочего, есть таблица, потенциально на несколько млрд. записей. У нее 2 ключевых поля - IP (inet) и Port (integer), и еще одно текстовое (character varing 1000). Выборка может быть по IP (или по маске), или по порту, или по обоим сразу. Вероятно, что потребуется еще и поиск по тексту. Я сделал индексы CREATE UNIQUE INDEX ipport_idx ON tablex USING btree (ip, port) CREATE INDEX txt1_idx ON tablex USING btree (txt1) Собственно вопросы: 1. В таблице пока всего 250 млн. записей, но время вставки записей уже напрягает - пару миллионов добавляет минут 15-20. Думаю, дальше будет хуже, а потому вопрос, какие варианты индексов еще имеются? Будет ли быстрее, если создать на ip и port 2 отдельных индекса? И имеет ли смылс индекс на порт, где на весь миллиард записей будет несколько тыс. уникальных значений всего? В то же вреамя, для поля ip не лучше ли будет тип индекса gist? 2. Как дела с текстовым поиском? Есть ли вообще толк от btree? Просто в постгрес я пока не особо... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2017, 14:16 |
|
Большие таблицы и индексы
|
|||
---|---|---|---|
#18+
snk002, как часто обновляются данные ? или только вставляются ? если да -- то вставка идёт диапазонами, или хаотично ? на кой, простите , черт, индексируется текст(1000) б-тривом ? может быть оно (индексирование) там совсем не надо ? или индекс нужен, но, например, триграммный ? каковы основные выборки по тексту из таблы ? неужто по полной строке ? и почему не партицировать табличку по диапазонам ip ? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2017, 18:46 |
|
Большие таблицы и индексы
|
|||
---|---|---|---|
#18+
snk002, а на сколько быстрее вставка в таблицу без индексов? Вставляете с использованием COPY? И, присоединяюсь к вопросу "вставка идёт диапазонами, или хаотично"? Кластеризована ли таблица по индексу? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2017, 10:57 |
|
Большие таблицы и индексы
|
|||
---|---|---|---|
#18+
qwwq, 1. Данные обновляются так: в ежедневно ручном реиме вливается по несколько кусков по несколько миллионов записей. Вставляются так: IP - хаотично, порт 1 на кусок. 2. Обновлений в данной таблице не предусмотрено. Разве что по какому-то случаю придется грохнуть ошибочно вставленный кусок в неск. миллионов разово 3. Текстовая выборка - тут я пока не очень в курсе. Но, судя по всему, будет выбираться как-то так: like '%keyword%' 4. почему не партицировать табличку по диапазонам ip? Эм. не знаю. Не факт, что это правильно с т.з. использования. А где пр о партицирование почитать? LeXa NalBat, Вставляю так: сначала COPY в однотипную таблицу без индексов, потом из нее insert select on conflict do nothing. Просто на случай кривых данных или внезапного появления дубля по уникальному индексу не хочется заново запускать. Нет, не кластеризована. А чем мне это поможет? Я просто раньше преимущественно с MySQL/MyISAM работал, в основном, там много чего не было. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2017, 12:40 |
|
Большие таблицы и индексы
|
|||
---|---|---|---|
#18+
snk002, если табла от природы (а не руками) кластеризована (например только вставка от природы кластеризована по суррогатному ключу -- счетчику, или таймстампу вставки) -- то можно попытаться попользовать брин -ы по этим "измерениям". про секционировани (оно же партицирование) много где. даже тут частенько (ищите поиском). есть даже тулза от поцгресс-про в вашем случае напрашивается даже не просто партицирование, но шардинг. см. например . это, думаю, простейший пример. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2017, 12:59 |
|
Большие таблицы и индексы
|
|||
---|---|---|---|
#18+
snk002Вставляю так: сначала COPY в однотипную таблицу без индексов, потом из нее insert select on conflict do nothingЕсли на целевой таблице нет индексов, то такая вставка происходит быстрее? Намного? snk002... в ежедневно ручном реиме вливается по несколько кусков по несколько миллионов записейТогда может быть при такой редкой массированной вставке индексы предварительно удалять и после - создавать? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2017, 13:27 |
|
Большие таблицы и индексы
|
|||
---|---|---|---|
#18+
qwwq, А так понял, иаблицу надо создавать с OIDS? Я их не использовал. А стоит? Шардинг зачем? Тут нет множества параллельных запросов. А вот про секционирование почитаю. кстати, еслть ли в реальности толк от pg_pathman? LeXa NalBat без - быстрее, конечно. но пересоздавать каждый раз индекс на миллиард записей - не вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2017, 15:34 |
|
Большие таблицы и индексы
|
|||
---|---|---|---|
#18+
snk002qwwq, А так понял, иаблицу надо создавать с OIDS? не понял ход вашей мысли. snk002Шардинг зачем? Тут нет множества параллельных запросов.можно распараллелить и 1 запрос. скажем по ип нельзя -- т.к. партиечка/шарда -- одна, но действительно тяжелые будут по тексту, для которых в любом случае придется поднимать множество индексов (или вообще сканить всё) по разным партициям. вот тут--то и будет распараллеливание(дисковой) шардами. шардинг -- крайний случай партицирования. snk002А вот про секционирование почитаю. кстати, еслть ли в реальности толк от pg_pathman? я обходился без него, своими силами. но при доступе по маскам , если партиций будет реально много -- pg_pathman, в теории, должен помогать. или, возможно, придется написать хранимки -- динамически формировать запрос напрямую к партициям самостийно. в зависимости от сложности запросов по маскам. но есть где-то тут и жалобы на более долгий старт процесса (соединения), при использовании pg_pathman, например. партицирование позволит частично дропать/создавать индексы (только в "небольшой" партиции это будет не так дорого), приемлемо вакуумироваться, фризиться. и упростит прочее "обслуживание". но усложнит планирование развесистых запросов. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2017, 16:04 |
|
|
start [/forum/topic.php?fid=53&fpage=74&tid=1996520]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
others: | 303ms |
total: | 418ms |
0 / 0 |