Задать вопрос
Ответы пользователя по тегу PostgreSQL
  • Почему так сделано postgresql работа с tablespace?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    2022 год блин. Ставите весь целиком PGDATA на nvme ssd.

    Почему такие default_tablespace - потому что как бы их не сделать, всё равно сыпятся вопросы (куча вопросов) "ой а почему команда Х сделала Z, ведь логично что я хотел Y"
    Ответ написан
  • Как изменить формат вывода timestamp with time zone в postgresql?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    При отсутствии явных функций форматирования даты в запросе стиль вывода timestamp задаётся настройкой datestyle. Это на выбор несколько предустановленных форматов. Для таймзоны форматирование вида здесь. Стиль USE_XSD_DATES используется в xml и json, но через datestyle его использовать невозможно, а потому минутная часть в выводе будет присутствовать только отличная от нуля.

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

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Это-то динамическая? Хотите посмотреть на динамические цены - посмотрите на ценообразование некоторых авиакопаний, где цена на один и тот же рейс может ощутимо прыгать несколько раз в течении одного часа.

    Не, это вполне статичные цены у вас. А если вам дают формат "отель, категория номера, дата, цена" без дальнейшего деления - то и вовсе простой случай. Вот прямо так и импортируете в табличку id отеля, категория номера, дата, цена. Первые три поля - композитный первичный ключ.
    Запрос стоимости на отрезок времени:
    select hotel_id, category, sum(price) as total_price from hotel_prices where date between ? and ? and not on_stop_sale group by 1,2 having count(*) = количество_дней_в_диапазоне order by total_price

    (having нужен чтобы отсеять категории номеров, недоступные для продажи на весь диапазон дат)

    Ну пяток-десяток категорий номеров, немного лести про сотню отелей, на год вперёд... Вот только попробуйте заикнуться что эта кроха вырастет ну на тааак много строк что будет невероятно медленно работать.
    Ответ написан
    Комментировать
  • Есть ли какие-либо практические различия в PostgreSQL между доступом к jsonb через -> и []?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Начну с конца - для индексов это критично разные вещи. Планировщик даже пытаться анализировать не станет, эквивалентные это условия или нет. Если у вас есть индекс по my_column -> 'a', а в запросе вы написали "my_column"['b'] - то этот индекс использоваться не будет.

    Касательно самих двух операторов:
    -> ровесник jsonb как такового
    jsonb[element] - jsonb subscripting на языке документации - штука недавняя, лишь только прошлогодняя из pg14. Пока что нужно иметь в виду если вам может потребоваться более старая версия базы.
    По поведению отличий вроде не должно быть никаких. Оба варианта возвращают jsonb, поэтому IRL куда чаще используется ->> возвращающий текст.
    На уровне реализации оба приходят к одному и тому же getKeyJsonValueFromContainer. Вы скорее упрётесь в производительность разбора формата самого jsonb, чем заметите какую-то разницу в производительности родного оператора от type subscripting.
    Ответ написан
    Комментировать
  • Какие требования к физической репликации Postgresql 11?

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

    с centos 7 на убунту 20.04 реплицировать можно, но вы гарантированно попадаете на изменение правил сортировки строк в libc: https://wiki.postgresql.org/wiki/Locale_data_changes
    Для переезда на другую ОС годится (подняли реплику, в нужный момент переключили на неё мастер и реиндексировали пострадавшие индексы), для долговременной работы уже не очень вариант.
    Ответ написан
    2 комментария
  • Как сделать единую реплику базы данных Postresql из трех разных мастер серверов?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    • 3 независимых экземпляра postgresql на разных портах через потоковую репликацию. Просто, стабильно, надёжно
    • какая-то из форм логических репликаций. Приключения по сопровождению за свой счёт. Начать с pub/sub как штатный механизм
    Ответ написан
    Комментировать
  • Как проверить обьект jsonb на ilike со строкой в Postgres?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    exists(select from jsonb_array_elements_text(col->'elements') as el where 'first-element' ilike concat('%', el, '%'))

    если я верно понял ваше описание
    Ответ написан
    Комментировать
  • Как поменять тип данных в столбце postgresql?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    alter table tablename alter columnname type varchar;
    Ответ написан
    Комментировать
  • Как функция index scan в postgresql понимает тип индекса?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Весь раздел https://www.postgresql.org/docs/current/internals.html
    за исключением разве что System Catalogs

    Узел Index Scan в плане запроса - это далеко не одна функция, а целый отдельный src/backend/executor/nodeIndexscan.c
    Ну и кучка поддерживающих конструкций, чтобы от этого был толк. Большая кучка конструкций. Очень.

    Как функция index scan в postgresql понимает тип индекса?

    А ему и не надо.
    Если планировщик выбрал index scan - значит этот index access method предоставляет совместимый интерфейс. Далее index scan согласно контракту index access method дёргает методы этого конкретного AM, и уже сам AM решает, где у него что лежит и как доставать требуемые TID по заданным условиям.

    и как именно Postgre понимает, какую функцию следует применять

    postgresql или postgres. Базы postgre не существует.
    А муками выбора о плане запроса страдает планировщик, работающий перед executor'ом. И там настоящая чёрная магия (и костыли)
    Ответ написан
    Комментировать
  • Как решить ошибку "must be superuser or replication role to start walsender"?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Добавьте в log_line_prefix как минимум %h, затем ищите на том хосте, кто может пытаться запустить walsender. Это может быть как физическая, так и встроенная логическая репликация.
    %u в log_line_prefix покажет каким логином этот процесс авторизовался, может навести на какие-то мысли о том что именно искать.
    Ответ написан
    1 комментарий
  • Можно ли обновлять композитные типы в Postgres?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Эти две команды именно про enum:
    ALTER TYPE name ADD VALUE [ IF NOT EXISTS ] new_enum_value [ { BEFORE | AFTER } neighbor_enum_value ]
    ALTER TYPE name RENAME VALUE existing_enum_value TO new_enum_value

    Вот удаления значения из enum нет.

    Команды ADD/DROP/ALTER/RENAME ATTRIBUTE там же - это как раз про композитные типы. Уже используемые менять можно.
    Ответ написан
    Комментировать
  • Почему PostgreSQL ругается?

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

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    удаляется мало, добавляется пачками ( где то 10 миллионов в день )
    не удаляется и не обновляется ничего

    Так и что тогда vacuum'ить? Нечего, мёртвых строк нет же.

    insert'ы до pg13 не провоцируют приход автовакуума (autovacuum_vacuum_insert_scale_factor), да и это было добавлено не ради вакуума, а ради freeze, чтобы потом autovacuum to prevent wraparound было меньше работы.
    Ответ написан
  • Есть ли штатный способ разбить большой UPDATE на транзакционные части?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Как делить одну большую операцию на части - необходимо базе объяснять.

    PG14 - нагенерировать запросов
    update ... where ctid between '(N,1)' and '(N+1000,1)'

    где N от 0 до relpages из pg_class и запустить.

    Если хочется - можно обернуть в анонимку DO, каждую очередную итерацию делая commit.

    На более старых версиях - выбрать какой-нибудь индекс скоррелированный с физическим расположением данных и идти вдоль него, нагенерировав запросов
    update ... where somecolumn between ? and ?
    кусками некоторого размера. Не имеет решающего значения соблюдение размера одного обновления, лишь бы выполнялся за разумное время.

    Во время миграции поглядывайте, успевает ли autovacuum за вами, успевают ли реплики и archiver (если есть).
    Ответ написан
    Комментировать
  • Как изменить директорию для postgresql wal?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    У initdb и pg_basebackup есть ключи запуска для этого.
    А на уже существующей базе - остановить базу, скопировать wal'ы в нужное место, заменить директорию wal'ов в PGDATA симлинком на новое место, запустить базу.
    Ответ написан
    1 комментарий
  • Как определить источник обращение к БД?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Используйте более подробный log_line_prefix. В частности, нужен %h

    log_line_prefix = '%m %p %u@%d from %h [vxid:%v txid:%x] [%i] '

    Мы такой используем если нет значимых причин для иного.
    Ответ написан
    1 комментарий
  • Как решить ошибку "string indices must be integers" в postgresql?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    В postgresql такого текста ошибки нет.

    Этот запрос висит вечно

    Значит другие транзакции не дают вам получить access exclusive lock. (note: пока такой alter table в очереди ожидания - проект лежит)
    Посмотрите в pg_stat_activity что у вас запущено. например вот так
    Ответ написан
  • Как правильно составить запрос INSERT в postgresql?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    ... DO UPDATE SET payment_date = info.payment_date + interval '23 hours';

    Данные конфликтующей строки доступны
    The SET and WHERE clauses in ON CONFLICT DO UPDATE have access to the existing row using the table's name (or an alias), and to rows proposed for insertion using the special excluded table.

    имени таблицы (или алиаса указанного в запросе) - та версия строки что есть
    псевдоним excluded - те значения что этот insert предполагал записать
    Ответ написан
    2 комментария
  • Правильно ли организовано логирование?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Документация отвечает однозначно
    Current date and time (start of current transaction);

    current_timestamp - это всегда время начала транзакции. Сколько бы транзакция ни заняла времени, до её окончания current_timestamp будет возвращать одно и то же значение.
    А правильно это для вашей задачи или нужно использовать другую из функций датывремени - это только к вам вопрос.
    Ответ написан
    1 комментарий
  • Как ускорить работу слота репликации на PostgreSQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Скорей всего упираетесь в производительность IO на временных файлах, увеличение logical_decoding_work_mem с этим должно помочь.
    Затем посмотрите, не упираетесь ли в 100% cpu на этом процессе. logical decoding однопоточный, ему важна производительность в один поток. Тут ничего не поможет. Прочитать, понять и переупорядочить данные среди гигабайтов wal'ов всё равно придётся.
    Ответ написан
    Комментировать