Ответы пользователя по тегу Партиционирование и шардинг баз данных
  • Как партиционировать большую таблицу в PG 11?

    Melkij
    @Melkij
    PostgreSQL DBA
    если clock это unixtime, а так же именно по нему и хотим партиционировать в дальнейшем:

    begin;
    set local statement_timeout to '100ms';
    alter table history add constraint partition_key check (clock < :N) not valid;
    commit;
    alter table history validate constraint partition_key;
    begin;
    set local statement_timeout to '100ms';
    alter table history rename to history_old_data;
    create table history (...) partition by range (clock);
    alter table history attach partition history_old_data for values from (minvalue) to (:N);
    create table history_part_... partition of history for values from (:N) to (...);
    commit;


    :N - некая дата в будущем, до неё данные будут писаться в старую 5тб табличку, после - в новую партицию. Если до выбранного :N не успеете завершить миграцию - то удалить check constraint, иначе запись, конечно, встанет.
    Ответ написан
    2 комментария
  • В чем польза шардирования БД при наличии индексов?

    Melkij
    @Melkij
    PostgreSQL DBA
    Пока у вас всего лишь миллионы записей - то вам ни шардирование ни даже партицирование не нужно.

    В общем, в чем конкретно выигрыш от шардирования?

    Масштабирование операций записи когда более производительные диски и уже не поставить.
    Ответ написан
    Комментировать
  • Возможно ли настроить "автопартицирование" в PostgreSql?

    Melkij
    @Melkij
    PostgreSQL DBA
    Нет.

    PS: такие мелкие партиции скорей всего ухудшат производительность.
    Ответ написан
    Комментировать
  • Как избавиться от блокировок при обслуживание партиций внешней таблицы в БД PostgreSQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    vacuum full и reindex требуют тяжёлую блокировку и держать блокировку будут долго. Поэтому обычно их избегают.
    drop разумеется тоже требует эксклюзивную блокировку, но на короткое время. Важно понимать скользкую ситуацию - если вы пытаетесь взять эксклюзивную блокировку, но не можете её получить из-за других выполняемых транзакций - вы будете ждать окончания этих мешающих транзакций, но уже будете блокировать работу последующих транзакций.

    Если вы считаете, что много места пропало впустую - то это можно посчитать (поставив contrib расширение pgstattuple) вот этими нашими запросами: для таблиц и для индексов
    Если да, проблема с местом в этом - то вам помогут pgcompacttable или pg_repack

    Если данные по большей части архивные - имеет смысл заменить btree индексы на brin. Они медленнее, но очень сильно компактнее по диску.

    А отцеплять партиции - посмотреть в pg_stat_activity что вообще происходит, нет ли аномально длинных транзакций или idle in transaction (т.е. затупов на приложении). Затем с statement_timeout и lock_timeout в 1 секунду (или меньше даже) пробовать отцепить пока не получится.
    Ответ написан
    4 комментария
  • Почему медленная выборка в партицированных таблицах Postgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    Покажите explain analyze. Судя по cost в explain, само выполнение запроса корректно.

    Рабочая версия - время жрет сам планировщик. 7к партиций - это очень много. Об этом есть даже заметка в мануале (о чём там только нет заметок, но попробуй их заметь)
    All constraints on all partitions of the master table are examined during constraint exclusion, so large numbers of partitions are likely to increase query planning time considerably. Partitioning using these techniques will work well with up to perhaps a hundred partitions; don't try to use many thousands of partitions.

    https://www.postgresql.org/docs/9.4/static/ddl-par...

    У postgresql партицирование сделано довольно странно и, вообще-то говоря, не предназначенными для этого средствами. Если у вас достаточно большая таблица, чтобы почувствовать бонусы от партицирования, то лучше ограничьтесь парой десятков разделов. Вот ещё статья тематическая есть: https://habrahabr.ru/post/273933/
    Ответ написан
  • Как правильно организовать Mysql Partitioning по DAYOFMONTH?

    Melkij
    @Melkij
    PostgreSQL DBA
    Покажите вот так:
    EXPLAIN PARTITIONS SELECT * FROM logs WHERE DAYOFMONTH(insert_date) BETWEEN '2014-10-28' AND '2014-10-29';
    Ответ написан