Ответы пользователя по тегу PostgreSQL
  • Как партиционировать большую таблицу в 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 комментария
  • Как уменьшить время выполнения запроса like '%uri%' в Postgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    create extension pg_trgm;
    create index concurrently db_url_trgm_idx on db1 using gin ("Url" gin_trgm_ops);

    https://www.postgresql.org/docs/current/pgtrgm.html
    Ответ написан
    Комментировать
  • Как задать дефолтные права на все таблицы в схеме в postgres?

    Melkij
    @Melkij
    PostgreSQL DBA
    Необходим свой комплект ALTER DEFAULT PRIVILEGES для каждого пользователя, который будет создавать объекты в базе.
    Это раз.

    Два - идея вообще стабильно работать будет только для CRUD. Всякие alter table требуют быть владельцем таблицы либо быть в группе владельца (не в общей с владельцем группе, а именно чтобы владелец таблицы был в группе пользователя).

    Подумайте над организацией процессов. Наименее проблемно будет, если у вас будет только один пользователь, который создаёт или меняет схему данных, а ro (select только) и rw (select/insert/update/delete) пользователей может быть много. Всё остальное к приключениям.
    Ответ написан
    Комментировать
  • Как транспонировать строки в столбцы?

    Melkij
    @Melkij
    PostgreSQL DBA
    проще на клиенте форматировать. Но поскольку число столбов в этой задаче можно считать константой, то можно и захардкодить
    select EXTRACT(YEAR FROM time) AS year,
    sum(cost) filter(where EXTRACT('month' FROM time) = 1) as jan,
    sum(cost) filter(where EXTRACT('month' FROM time) = 2) as feb,
    ...
    sum(cost) filter(where EXTRACT('month' FROM time) = 12) as dec
    from tablename
    where ...
    group by 1
    order by 1
    Ответ написан
    Комментировать
  • Оптимизируется ли UPDATE, если значения полей на самом деле не меняются?

    Melkij
    @Melkij
    PostgreSQL DBA
    В postgresql создаётся физически новая версия строки при update (с обновлением всех индексов либо hot update если применимо) даже если ни одно поле не меняет своё действительное значение. Есть встроенный триггер suppress_redundant_updates_trigger, который можно повесить на таблицу, тогда ничего действительно не меняющий в данных update будет пропускаться.

    Если меняется хотя бы одно значение - оптимизации не подлежит, должна быть записана новая версия строки в таблицу (чтобы MVCC обеспечить). Если возможно, оптимизация HOT update исключит сопутствующее обновление индексов.
    Ответ написан
    9 комментариев
  • PL/pgSQL. Не дает вернуть из функции значение типа setof record. Причина?

    Melkij
    @Melkij
    PostgreSQL DBA
    Вариант записи допустимый, а вот вызываете неверно:
    melkij=> create or replace function myfunc()
    returns setof record
    as $$
    declare
    res record;
    begin
    execute 'select 1' into res;
    return next res;
    execute 'select 2' into res;
    return next res;
    return;
    end;
    $$
    language plpgsql;
    CREATE FUNCTION
    melkij=> select * from myfunc() as s(i int);
     i 
    ---
     1
     2
    (2 строки)
    
    melkij=> select myfunc();
    ERROR:  materialize mode required, but it is not allowed in this context
    КОНТЕКСТ:  PL/pgSQL function myfunc() line 6 at RETURN NEXT


    PS: прямой return query (или return query execute если это реально необходимо) будет проще и нагляднее перекладывания return next через лишнюю переменную.
    Ответ написан
  • Можно ли восстановить дамп кластера postgresql-12 ( oc Ubuntu ) на postgresql 14 ( ос Alpine )?

    Melkij
    @Melkij
    PostgreSQL DBA
    Да
    Ответ написан
    Комментировать
  • Удаление базы данных postgresql без запущенного демона?

    Melkij
    @Melkij
    PostgreSQL DBA
    Без запущенного экземпляра postgresql не предусматривается никакого эквивалента drop database.

    Можно удалить весь PGDATA и восстановить из бекапа весь кластер (если бекапы бинарные aka pitr) либо инициализировать заново через initdb, запустить и импортировать дамп (если бекап представляет собой дампы).
    Ответ написан
    Комментировать
  • Какой уровень блокировки строк по умолчанию в запросе SELECT?

    Melkij
    @Melkij
    PostgreSQL DBA
    Ни один из перечисленных.
    Для простого SELECT нужны AccessShareLock на таблицу/индексы/etc. row-level блокировки не применяются за ненадобностью.
    Ответ написан
    Комментировать
  • Как сделать определение конфигурации поиска в другом столбце таблицы?

    Melkij
    @Melkij
    PostgreSQL DBA
    melkij=> \df to_tsvector
                                      Список функций
       Схема    |     Имя     | Тип данных результата | Типы данных аргументов |  Тип  
    ------------+-------------+-----------------------+------------------------+-------
     pg_catalog | to_tsvector | tsvector              | json                   | функ.
     pg_catalog | to_tsvector | tsvector              | jsonb                  | функ.
     pg_catalog | to_tsvector | tsvector              | regconfig, json        | функ.
     pg_catalog | to_tsvector | tsvector              | regconfig, jsonb       | функ.
     pg_catalog | to_tsvector | tsvector              | regconfig, text        | функ.
     pg_catalog | to_tsvector | tsvector              | text                   | функ.
    (6 строк)

    действительно не существует такой функции.

    Поправьте тип данных поля config на ожидаемый regconfig.
    Ответ написан
    Комментировать
  • Почему тип столбца xml не проверяет входное значение?

    Melkij
    @Melkij
    PostgreSQL DBA
    melkij=> select 'hello'::xml;
      xml  
    -------
     hello
    (1 строка)
    
    melkij=> select '<foo>hello'::xml;
    ERROR:  invalid XML content
    СТРОКА 1: select '<foo>hello'::xml;
                     ^
    ПОДРОБНОСТИ:  line 1: Premature end of data in tag foo line 1
    <foo>hello
              ^
    line 1: chunk is not well balanced
    <foo>hello

    есть проверка.

    Если вам нужно проверить, что это не просто валидный xml, но целый документ - добавьте check constraint с проверкой на columnname is document
    Ответ написан
    2 комментария
  • Секционирование таблицы по хэшу. В чем принцип?

    Melkij
    @Melkij
    PostgreSQL DBA
    Как-как. Вызывается некоторая хэш-функция для значений ключа партицирования, её результат делится нацело на modulus, строка попадёт в ту партицию, для которой совпадает remainder.

    create table part (i int) partition by hash (i);
    create table part_0 partition of part FOR VALUES WITH (MODULUS 2, REMAINDER 0);
    create table part_1 partition of part FOR VALUES WITH (MODULUS 2, REMAINDER 1);
    insert into part select generate_series(1,10);
    select * from only part_0;
    select * from only part_1;


    на слишком малых выборках хэш ожидаемо может быть не столь равномерно распределён.
    Ответ написан
    Комментировать
  • Как правильно очищать archived WAL логи PostgreSQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    Берёте pgbackrest.
    Ну или walg или barman какие.

    Руками свой собственный конструктор собирать дело малополезное и, что важнее, для бекапов просто опасное.

    архивные логи ДО-момента backup'а уже не нужны

    до позиции LSN на момент запуска basebackup, самого старого из тех, который по вашей политике резервного копирования нужно хранить.
    Ответ написан
    2 комментария
  • Почему пропускается отчистка?

    Melkij
    @Melkij
    PostgreSQL DBA
    skipping vacuum of \"%s\" --- lock not available - это не интересно, это штатное поведение. Причина именно та которая написана. Автовакуум тут хочет поработать, но какая-то другая запущенная транзакция держит конфликтующий лок на таблицу. Автовакуум не ждёт этот лок, а просто отменяется и попробует прийти попозже.

    А вот Segmentation fault - ну, это Segmentation fault, также известный как сегфолт. Ставите все доступные минорные обновления какие есть, если после этого по прежнему сегфолтится - то зовёте кого-то кто понимает в gdb или разбираетесь сами. Имея результаты изысканий, по возможности (но крайне рекомендуется) с обрезанным до воспроизводимого примера дампом, идёте к разработчику базы. Обратите внимание, поскольку вы говорите про 1с - то это точно НЕ postgresql global developing group, а какой-то местный форк. Потому что 1с не осилили работать с postgresql.
    Ответ написан
  • Как сделать выбрку по массиву JSON в Postgresql 9.6?

    Melkij
    @Melkij
    PostgreSQL DBA
    select (select j->>'name' from jsonb_array_elements(jsonb_field) as j where j->>'custom_twine' = 'custom_38') from tablename
    Ответ написан
    1 комментарий
  • Как хранятся имена сущностей в PSQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    Все unquoted identifiers принудительно приводятся парсером в нижний регистр.
    quoted identifiers - используются как есть.
    https://www.postgresql.org/docs/current/sql-syntax...
    Ответ написан
    Комментировать
  • Как проверить бекап postgres что он не битый?

    Melkij
    @Melkij
    PostgreSQL DBA
    Проверить бекап - путь только один, это восстановиться с него и посмотреть всё ли на месте. То самое известное, что все администраторы по наличию бекапов делятся на 3 типа: кто не делает бекапы, делает бекапы и тех, кто проверяет восстановление из бекапа.

    прервался ли pg_dump в какой-то момент - смотреть можно, как обычно, по коду возврата, а так же по stderr.

    PS: довольно тревожная мысль не сохранять права доступа
    Ответ написан
    5 комментариев
  • Как скопировать данные с одной таблицы в другую и обновить данные?

    Melkij
    @Melkij
    PostgreSQL DBA
    при наличии уникального ограничения по phone
    insert into desc (phone, name, nickname)
    select phone, name, nickname from src
    on conflict (phone) do update name = excluded.name
    Ответ написан
  • Почему не работает хранимая процедура?

    Melkij
    @Melkij
    PostgreSQL DBA
    но она ничего не возвращает (данные не показываются)

    давайте начнём с простого "а почему должно?". Где в мануале вы это вычитали? В том самом мануале, где написано, что процедуры в отличии от функций ничего не возвращают сами по себе и вовсе не имеют returning?

    Вам нужна функция, а не процедура.

    Ну а вообще, очень вероятно, что переосмыслить дизайн схемы и привести в нормальную форму, а не функция.
    Ответ написан
    Комментировать
  • Почему возникает такая ошибка pg_restore: [archiver] unsupported version (1.14) in file header?

    Melkij
    @Melkij
    PostgreSQL DBA
    custom format version 1.14 - это поддержка table access method. Дамп был снят с использованием pg_dump по крайней мере от postgresql 12.
    pg_restore должен быть никак не ниже версии postgresql 12 для распаковки этого формата. С 99% вероятность сможет распаковать в базу более старой версии чем 12, но сам pg_restore обязан быть не ниже этой версии.

    Совместимость с будущими версиями формата, знаете ли, сложное дело без машины времени.
    Ответ написан
    Комментировать