Задать вопрос
  • Postgresql ltree: как получить вершины (все записи без родителей)?

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

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


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

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

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

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

    Уточните в документации к своей библиотеке доступа к базе, как для неё правильно передавать переменное число параметров в параметризованный запрос (prepared statement), подобно эталонному PQexecParams.
    Ответ написан
    1 комментарий
  • Как написать функцию для парсинга json на PLpgSQL?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    raise notice '%', l_json->>l_key;
    всё
    Ответ написан
  • Potsgres 13 - как реализовать систему Master-Master?

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

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

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

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

    Наверняка видели, когда переходите на следующую страницу (например, лента постов отсортированная по времени публикации), вы вдруг видите те же самые записи что только что видели - просто потому что пока вы читали предыдущую страницу кто-то опубликовал новые посты и offset вас честно сдвинул.
    Ответ написан
    1 комментарий
  • Доп. вопрос к ответу - Это будет 2 RAID1 по 4 диска или 4 RAID1 по 2 диска, которые дальше объединены в RAID0?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Зависит от реализации.

    В linux raid (mdraid), например, raid10 - это особая штука. Сделать raid10 на 3 дисках? Да не вопрос, соберём и будет работать, честно гарантировать выживание массива при выпадении одного любого диска. А если хотите - можете собрать raid10 с избыточностью 3, тогда может помереть любые два диска.
    Куда какой блок при этом пишется - зависит от layout, это не просто зеркало поверх страйпа (или наоборот)

    Если говорить "по учебнику" - то для RAID10 нужно минимум 4 диска. Массив переживёт выпадение только одного любого из дисков массива. Максимальное число выпавших дисков не зависит от количества дисков в массиве. Выпадение второго диска может быть фатально. Но при большом везении RAID10 может потерять до половины дисков массива - если вы теряете только те блоки, которые массив может прочитать с другого живого диска.
    Ответ написан
    Комментировать
  • Почему процессоры без встроенной карты не быстрее процессоров со встроенной?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Потому что это одни и те же кристаллы. Зачем разрабатывать и производить много разных модификаций кристаллов, если можно взять один и тот же, включать/отключать некоторые блоки, заодно тем самым уменьшая общую отбраковку.

    Ведь память это же самое дешевое, что можно сделать на кристалле?

    Это как раз обычно самое дорогое - самый большой по площади регион. Больше площадь = меньше кристаллов с пластины. Больше площадь кристалла = выше риск получения брака у каждого из кристаллов. Меньше исправных кристаллов = выше стоимость каждого.
    Ответ написан
    Комментировать
  • PSQL отрезает концовки некоторых слов в to_tsvector, что делать?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    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
    DBA для вашего PostgreSQL?
    2022 год блин. Ставите весь целиком PGDATA на nvme ssd.

    Почему такие default_tablespace - потому что как бы их не сделать, всё равно сыпятся вопросы (куча вопросов) "ой а почему команда Х сделала Z, ведь логично что я хотел Y"
    Ответ написан
  • Не могу выполнить запрос к БД используя PDO. В чём проблема?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Как должно быть видно по тексту ошибки, ругается не PHP, а совсем даже СУБД.

    TLDR: структура запроса (например, сортировка) через prepared statements изменяться не может. Только константы в запросе.
    Ответ написан
    Комментировать
  • Как освободить пространство с LVM?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Если есть под рукой пустой накопитель от 82гб:
    - подключить доп диск
    - pvcreate на него на всю ёмкость
    - vgextend
    - pvmove старый_диск новый_диск
    - vgreduce
    - pvremove
    - переделываете партиции на nvme как нравится
    - повторить заново с pvcreate только теперь pvmove с временного диска обратно на nvme

    Если на время перенести некуда - то pvresize + уменьшить размер раздела, потом создать новый раздел на освободившемся месте.

    PS: доктор, я в каждой команде написал pg вместо vg, это ещё лечится?
    Ответ написан
    Комментировать
  • Как изменить формат вывода timestamp with time zone в postgresql?

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

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

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

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

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

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

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Можно если ставить коммутатор умеющий VLAN. VLAN'ами разделяете порты так чтобы кабель провайдера был в одном сегменте с микротиком и только с ним, регистратор куда ему там надо (я хз должен ли у вас он быть в локальной сети дома, в сети провайдера или в свой отдельной только для него), микротик соответственно настраиваете маршрутизировать трафик между этими vlan'ами.
    Ответ написан
    Комментировать
  • Как сделать единую реплику базы данных Postresql из трех разных мастер серверов?

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