Ответы пользователя по тегу PostgreSQL
  • Верно ли утверждение, что FSM (free space map) хранит значения округленные до 1/256 от размера страницы?

    Melkij
    @Melkij
    PostgreSQL DBA
    https://github.com/postgres/postgres/blob/REL_15_S...
    We allocate one map byte to each page, allowing us to record free space
    at a granularity of 1/256th of a page. Another way to say it is that
    the stored value is the free space divided by BLCKSZ/256 (rounding down).

    один байт FSM отражает страницу данных.
    Ответ написан
  • Как решить проблему collation "en_US" for encoding "UTF8" does not exist?

    Melkij
    @Melkij
    PostgreSQL DBA
    Такой текст ошибки используется только в одном месте и суть его заключается в том, что в pg_collation нет такой строки.
    Что через https://www.postgresql.org/docs/current/collation.html приводит к вопросу: существует ли локаль en_US.utf8 у вас в системе, чтобы её использовать?

    Если нет - создайте локаль. Затем select pg_import_system_collations('public'); должно быть достаточно
    Ответ написан
    3 комментария
  • Как работает блокировка в Postgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    если кратко: https://github.com/postgres/postgres/blob/REL_15_S...

    только требуемые строки, в select for update (и родственниках) это видно отдельным LockRows плана выполнения
    Ответ написан
    Комментировать
  • Почему не работают снепшоты в postgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    But note that any database changes made by any one of these transactions remain invisible to the other transactions, as is usual for changes made by uncommitted transactions.

    https://www.postgresql.org/docs/current/functions-...
    поведение полностью соответствует задокументированному.
    Ответ написан
    Комментировать
  • Что происходит в момент добавления нового столбца в БД?

    Melkij
    @Melkij
    PostgreSQL DBA
    https://ru.stackoverflow.com/q/721985/203622

    Вот есть таблица с 1000 записей. В ней 9 колонок. На 3 из них есть индексы.

    На такой мелочи без разницы. Перезапись такой крохи штука быстрая.

    1. Возможно ли дозапись новой колонки в существующую структуру? Или под капотом происходит полное копирование всех данных в новую таблицу (табличное пространство?)

    В зависимости от конкретного alter table add column.
    Если вы добавляете add column score float default random() - то будем переписывать всю таблицу и перестраивать все существующие индексы.
    Если default с константой и у вас pg11 или новее - то обновим в системном каталоге описание таблицы, а саму таблицу трогать не будем.
    Если нет default (т.е. null) - то без оглядки на версию базы просто обновим описание таблицы и сами файлы таблицы трогать не будем.

    2. Происходит ли пересоздание индексов?

    да, если выполняется table rewrite

    3. Происходят ли какие-то еще важные для понимания сути работы в БД процессы?

    классическая история частых даунтаймов, что для операции нужна эксклюзивная блокировка. То есть для взятие блокировки не должно быть совсем никого, кто эту таблицу трогал в транзакции, начавшейся до alter table. Если у вас в это время работает какая-то аналитика на 10 минут или pg_dump - будут приключения, нужен statement_timeout
    Ответ написан
    2 комментария
  • Postgresql ltree: как получить вершины (все записи без родителей)?

    Melkij
    @Melkij
    PostgreSQL DBA
    Обратите внимание, "получить записи яляющиеся вершинами" и "все записи без родителей" - это разные задачи.

    where nlevel(ltree) = 1 -- все записи состоящие из одного уровня.


    Записи без родителей - это когда у вас есть ltree "Top.Science.Space.Astronomy", но нет записи "Top.Science.Space"
    Ответ написан
    1 комментарий
  • Можно ли восстановить дамп кластера postgresql-12 на версии postgresql-10?

    Melkij
    @Melkij
    PostgreSQL DBA
    Да, в рамках возможного. Какой-нибудь create procedure ничего кроме ошибки не даст, не было такого синтаксиса в pg10. Набор простых табличек - да хоть в postgresql 8.0
    Ответ написан
    Комментировать
  • Что за магия с PostgreSQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    приведение массива record к массиву композитного типа позиционное, а не символьное. Поменяйте в
    SELECT DISTINCT ON (asin) asin, price, reviews, raing

    порядок полей на совпадающий с таковым в таблице.

    убрали бы лишние подзапросы, что ли.
    (SELECT array_agg(j) FROM (SELECT DISTINCT ON (j.asin) j FROM jsonb_populate_recordset(NULL::t_best_asin_ranking_2, '[{
    "asin":"B06XH9FNH1",                                                                                                  
    "price": 1.5,                                                                                                   
    "rating": 1.5,
    "reviews": 1
    }]') j ORDER BY j.asin) r);

    вот так хотя бы.
    Ответ написан
    4 комментария
  • Как работает индекс при составном UniqueConstraint?

    Melkij
    @Melkij
    PostgreSQL DBA
    В настоящее время (pg15) уникальное ограничение может быть только btree индексом.
    Следовательно, общее для btree правило префиксного поиска. btree(a,b,c) может так же эффективно использоваться для поиска по префиксу - where a = ? или where a = ? and b = ? - но не может эффективно использоваться для where b = ? или where c = ?
    Ответ написан
    4 комментария
  • Комбинированный запрос в зависимости от условия?

    Melkij
    @Melkij
    PostgreSQL DBA
    не надо пытаться запутывать планировщик странными условиями, у него своей работы хватает. https://use-the-index-luke.com/sql/where-clause/ob...
    Нужно условие в запросе? Добавьте это условие в текст запроса. Не нужно условие? Не добавляйте его в текст запроса.

    Уточните в документации к своей библиотеке доступа к базе, как для неё правильно передавать переменное число параметров в параметризованный запрос (prepared statement), подобно эталонному PQexecParams.
    Ответ написан
    1 комментарий
  • Potsgres 13 - как реализовать систему Master-Master?

    Melkij
    @Melkij
    PostgreSQL DBA
    Никак.

    Если очень хотите головной боли и новых аварий по ночам вместо того чтобы спокойно спать - возьмите какой-нибудь autofailover типа patroni и прочих.

    Критичная проблема фундаментальна - CAP теорема в целом и последствия split brain в частности.
    Ответ написан
    2 комментария
  • Используется ли пагинация в SQL запросах?

    Melkij
    @Melkij
    PostgreSQL DBA
    Хотите сделать пагинацию правильно - не используйте offset, а передавайте сведения сортировки последнего показанного поста.
    https://use-the-index-luke.com/sql/partial-results...
    https://use-the-index-luke.com/no-offset

    Наверняка видели, когда переходите на следующую страницу (например, лента постов отсортированная по времени публикации), вы вдруг видите те же самые записи что только что видели - просто потому что пока вы читали предыдущую страницу кто-то опубликовал новые посты и offset вас честно сдвинул.
    Ответ написан
    1 комментарий
  • PSQL отрезает концовки некоторых слов в to_tsvector, что делать?

    Melkij
    @Melkij
    PostgreSQL DBA
    melkij=> SELECT * from ts_debug('russian', 'дело сделать кот наконец то');
     alias |    description    |  token  |  dictionaries  |  dictionary  | lexemes 
    -------+-------------------+---------+----------------+--------------+---------
     word  | Word, all letters | дело    | {russian_stem} | russian_stem | {дел}
     blank | Space symbols     |         | {}             |              | 
     word  | Word, all letters | сделать | {russian_stem} | russian_stem | {сдела}
     blank | Space symbols     |         | {}             |              | 
     word  | Word, all letters | кот     | {russian_stem} | russian_stem | {кот}
     blank | Space symbols     |         | {}             |              | 
     word  | Word, all letters | наконец | {russian_stem} | russian_stem | {}
     blank | Space symbols     |         | {}             |              | 
     word  | Word, all letters | то      | {russian_stem} | russian_stem | {}
    (9 строк)


    lexemes text[] — the lexeme(s) produced by the dictionary that recognized the token, or NULL if none did; an empty array ({}) means it was recognized as a stop word

    https://www.postgresql.org/docs/current/textsearch...

    Там же, далее:
    melkij=> SELECT ts_lexize('russian_stem', 'наконец');
     ts_lexize 
    -----------
     {}

    ts_lexize returns an array of lexemes if the input token is known to the dictionary, or an empty array if the token is known to the dictionary but it is a stop word, or NULL if it is an unknown word.

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

    Если вы с таким поведением не согласны, используйте другой словарь или делаете свой: https://www.postgresql.org/docs/current/textsearch...
    Ответ написан
    Комментировать
  • Почему так сделано postgresql работа с tablespace?

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

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

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

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

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

    Не, это вполне статичные цены у вас. А если вам дают формат "отель, категория номера, дата, цена" без дальнейшего деления - то и вовсе простой случай. Вот прямо так и импортируете в табличку 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
    PostgreSQL DBA
    Начну с конца - для индексов это критично разные вещи. Планировщик даже пытаться анализировать не станет, эквивалентные это условия или нет. Если у вас есть индекс по my_column -> 'a', а в запросе вы написали "my_column"['b'] - то этот индекс использоваться не будет.

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

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

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

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