Задать вопрос
Ответы пользователя по тегу PostgreSQL
  • Почему для триггера AFTER INSERT FOR EACH ROW ошибка: отношение "new" не существует?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    insert into test_after(val) values(new.txt);
    Ответ написан
    2 комментария
  • Как в PostgreSQL 16 преобразовать значение типа uuid в тип bytea?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    важен вопрос "зачем"

    а так, универсально через промежуточное приведение к тексту ::text::bytea
    Ответ написан
  • Есть ли преимущества от удаления поля id при создании таблицы?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Вникаете в предметную область той задачи, для которой эта таблица используется. Всё, ответ найден.

    Нет ничего удивительного в таблицах, у которых нет поля id. В предметной области может быть достаточно хороший естественный ключ.

    С точки зрения производительности - да, конечно, есть смысл не хранить ненужные данные. Меньше строка => меньше таблица => в тот же объём RAM влезает больше кеша и меньше IO. Немного, правда, чистыми 8гб на каждый миллиард строк получается всего для bigint. Но если поле больше ни для чего не нужно, то почему бы и нет?
    Ответ написан
    Комментировать
  • Как определить причины низкой производительности postgres?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Вы смотрите на совершенно бесполезный график. Смотрите на полезные.

    Если у вас табличка с 10 индексами и к ней select * from foo where id = ? - то это минимум 11 AccessShareLock. Совершенно логично, что чем больше параллельно нагрузки - тем больше вы увидите AccessShareLock. И дальше куда с этим? Вот и получается совершенно бесполезный график. А задирание max_connections сделает только хуже.

    Посмотрите график CPU, есть ли в принципе CPU свободный (помним что у вас наверняка есть HT, значит 100% утилизации недостижимы, реальный потолок окажется где-то в районе 70-90%)
    Посмотрите графики латентности IO. Если проседает латентность чтения или записи под нагрузкой - то это будет причина замедления. СУБД очень чувствительны к латентности.
    Дальше графики pg_stat_activity с разбивкой по state. Если растут idle in transaction - проверять как дела на приложении, а так же сеть.
    Конечно, графики по pg_stat_statements. top5 запросов по времени выполнения, для начала.
    И проверить наличие корреляции с графиком длительности самой старой транзакции.
    Ответ написан
    4 комментария
  • Отличие md5 от scram-sha-256 в pg_hba.conf postgresql?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Аутентификация через метод md5 выполнит парольную проверку как для пароля сохранённого с password_encryption = md5 (ныне уже deprecated, но встречается в большинстве баз, созданных не недавно), так и пароли сохранённые в scram-sha-256. Реализацию pg_hba md5 специально расширили при появлении scram-sha-256 таким образом, для облегчения миграции.

    Указание scram-sha-256 в pg_hba будет требовать именно пароль согласно scram-sha-256 и не будет принимать пароли старых учётных записей, созданных с md5 encryption.

    Вполне вероятно, что у вашей базы password_encryption сконфигурирован в scram-sha-256, все пользователи кто имеет пароли, так же в scram-sha-256 и нужды в md5 аутентификации в pg_hba нет.
    Ответ написан
    Комментировать
  • Как работают явные блокировки в PostgreSQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Блокировки строк и блокировки таблиц (и прочих объектов) - два разных механизма. (а serializable изоляция и вовсе частично третий)

    Блокировки строк отмечают информацию о себе специальными флагами в заголовке самой заблокированной строки. Запросы, которым нужна блокировка строки сначала проверяют, не отмечена ли эта строка блокировкой, затем проверяют что сейчас с той транзакцией, идентификатор transaction ID которой указан в информации о блокировке. Если транзакция ещё в работе - то начинаем ждать её завершение (или пропускаем строку для skip locked или кидает ошибку если nowait)
    Блокировки строк, будь то select for share/for update или пишущие запросы, всегда работают с самой актуальной версией строки.

    В то же самое время, любой запрос, трогающий таблицу (даже select) берёт блокировку на эту таблицу соответствующего своим потребностям уровня. Пока не возьмёт блокировку на таблицу - вообще не начнёт выполняться. Информация об этих блокировках размещается в сегменте shared memory памяти, потому доступны всем процессам базы. Если другие бекенды не держат блокировку таблицы конфликтующую с желаемым нашей транзакцией (или ещё только ждут блокировку более высокого уровня), то запрос блокировки удовлетворяется и работа продолжается.
    Ответ написан
    Комментировать
  • Почему с фильтром PostgreSQL выдаёт больше записей?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Смотрите свои данные. Совершенно логично, что если у вас есть клиент №5 с такими данными:
    insert into appointments (customer_id, in_trash, status, filial_id, invoice_id, time_start) values 
    (5, false, 4, 1, null, '2023-12-23'),
    (5, false, 4, 1, 123, '2024-01-13')

    то он не попадёт в результат первого запроса, но попадёт в результат второго. И оба ответа верны, а вот какой из них хочет знать бизнес - уточнять надо у бизнеса.
    Ответ написан
    Комментировать
  • Почему не создается бд в postgreSQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    должно быть
    postgres=# create database mydb;


    нет такого сокращение у парсера как create db, но, что важнее, SQL запрос должен завершаться символом ;

    Приглашение командной строки потому и меняется с postgres=# на postgres-# как индикатор того, что psql ожидает дальнейший ввод многострочного SQL, пока не встретится ;
    Метакоманды psql, в то же время, действительно продолжают обрабатываться во время многострочного ввода.
    Ответ написан
    Комментировать
  • Можно ли создать пользователя во время миграции?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Можно, это даже транзакционная команда. Разумеется, до окончания транзакции авторизоваться с именем этого пользователя не получится.

    PS: больше одного супера - большой вопрос к организации работы базы
    Ответ написан
    Комментировать
  • CREATE USER не учитывает регистр?

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

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    select distinct on (created_at::date) created_at, value from tablename order by created_at::date, value desc;
    Ответ написан
    Комментировать
  • Почему real может хранить числа от 1E-37 до 1E+37, но выводимое значение не больше 9 цифр?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    См. IEEE 754 потому что это именно он. И на всё наблюдаемое "странное" поведение типов с плавающей запятой ответ един - потому что IEEE 754.
    Ответ написан
    Комментировать
  • Почему postgresql выбирает неоптимальный план выполнения для простого JOIN?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Я выполняю 2 одинаковых запроса

    "WHERE friends_info.user_id = 1" vs "WHERE friends_info.friend_id= 1"

    о да, одинаковые, да как бы не так. Полностью разные запросы, естественно, могут иметь различные оптимальные планы выполнения.

    Bitmap Index Scan on ix_friends_user_id (cost=0.00..61.56 rows=5465 width=0) (actual time=0.742..0.743 rows=88 loops=1)

    Суть ошибки выбора плана. Какое распределение данных в таблице? Каков размер самой таблицы? Вероятно несколько пользователей занимают значительную часть таблицы и это сбивает оценку селективности.
    Простое чуть приподнять SET STATISTICS по полю, собрать новый analyze и посмотреть на оценку числа строк.

    PS: индекс ix_friends_user_id должен быть удалён как бесполезный при наличии friends_info_user_id_friend_id_key
    Ответ написан
    3 комментария
  • Как задать пароль пользователю postgres, если авторизация по ssh-ключу?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    А как между собой связаны postgres, пароль пользователя unix и способ авторизации ssh? Да никак.

    ssh аутентификация по ключу не исключает наличия пароля пользователя, sudo может быть настроен без пароля, авторизация postgresql может быть настроена без sudo раз вы как-то собрали и запустили СУБД без использования запароленного sudo этого пользователя.

    Проблема-то где?
    Ответ написан
  • Как pgcompacttable работает с HOT-updates?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    maintainer here.

    Других вариантов у нас нет, обновляем тапл до тех пор пока он не окажется на странице вне того диапазона страниц с которым работаем в этой итерации. Поскольку обновления в одной транзакции, даже микровавуум не имеет возможности вычищать предыдущие версии строк и тапл вынужден будет переместиться с этой страницы в конечном итоге на другую страницу.
    Ответ написан
  • Как выбрать записи, для которых записи в связанной таблице не равны значению?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Буквально так и пишется дай messages для который нет вот таких
    select ... from messages where not exists (select from comments where comments.message_id = messages.id and comments.author_id = 100);
    Ответ написан
    Комментировать
  • Что не так в LIKE?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    tldr: WHERE a LIKE concat('%',$1,'%') либо конкатенировать к параметру на стороне приложения.

    '%$1%' - это строковой литерал, константа из 4 символов. Внутри литерала никто параметры искать и подставлять не будет. Поэтому в запросе не найдено ни одного места для параметров, а вы передаёте один параметр - что явная ошибка логики программы, об этом и выводится ошибка.
    Ответ написан
    1 комментарий
  • Можно ли гарантировать надежность снапшота?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Когда появляются требования ко времени восстановления из бекапа - то почти наверняка уже доросли до полноценного PiTR и лучше рассматривать именно полновесный бекап postgresql, чем сооружать снэпшоты.
    Берёте pgbackrest, настраиваете архив WAL, желаемую периодичность снятия basebackup и сроки удержания. Ну либо barman или wal-g, тут по вкусу, смысл тот же.

    Получаете полностью корректный с точки зрения самой базы снэпшот (ака basebackup), а так же возможность восстановиться на произвольную точку времени, а не только на момент снятия слепка. Без штрафа производительности записи от снэпшота LVM, без CoW файловых систем.

    Реплика - не бекап, решают разные задачи. Реплика ответит на вопрос "как быстро мы можем восстановить базу при полном отказе основного сервера", но не ответит на вопрос "как быстро можем восстановить удалённую табличку". Если у вас важная база и всё ещё нет реплики - ну, это странно =)
    Ответ написан
    Комментировать
  • Как правильно организовать выборку зашифрованных данных PostgreSQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Никак.

    Ловите своих DBA, архитектора, безопасников, начальство и совместно вникаете, существует ли вообще вектор атаки, от которого вы так пытаетесь защититься.
    Один постоянный универсальный ключ шифрования зашитый в приложении и открыто передающийся по сети - это больше профанация чем безопасность. И хорошо ещё, если ключ не сохраняется в логах базы вовсе в открытом виде.

    Если начальство решает, что да, такое шифрование необходимо и от чего-то защищает - то это будет прямым ответом на задачу: поскольку необходимо шифрование parent_iin, то быстрый поиск по этому полю невозможен.

    Единственное возможное исключение: если ваша функция шифрования обязуется быть immutable в терминах postgresql, т.е. на один и тот же ключ и исходные данные генерировать всегда один и тот же бинарно идентичный результат. Тогда делаете индекс по parent_iin и ищете по условию where parent_iin = функция_шифрования(данные, ключ) то есть по зашифрованному представлению данных.
    Ответ написан
    Комментировать
  • Как установить plrust под windows для создания функций в pgAdmin?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Ни документация ни гитхаб не упоминает поддержку экзотических платформ вроде windows. Только обычный linux.

    Попробуйте творчески адаптировать процедуру установки plrust из исходников под вашу платформу (возможно что не получится). Ну или просто поставить обычный linux, например в виртуалке.
    Ответ написан
    Комментировать