Ответы пользователя по тегу PostgreSQL
  • Почему where криво работает с boolean?

    Melkij
    @Melkij
    PostgreSQL DBA
    Потому что SQL - это троичная логика. true, false и NULL: https://www.postgresql.org/docs/current/functions-...

    null != что угодно - будет null в результате.
    Ответ написан
    Комментировать
  • Какие параметры вы используете, чтобы увеличить производительность БД?

    Melkij
    @Melkij
    PostgreSQL DBA
    postgres=# select count(*) from pg_settings where source != 'default';
    count
    -------
    116
    (1 row)

    Типичная картина. Всё это в очередной раз расписывать что на что влияет и зачем для production меняется, в какие стороны крутить и насколько? Вот уж нет желания.

    Память, checkpointer, autovacuum, bgwriter в первую очередь.

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

    Машина имеет 4ram 4cpu.

    Ну-ну.
    Ответ написан
    Комментировать
  • Какая репликация лучше в Postgres?

    Melkij
    @Melkij
    PostgreSQL DBA
    в постгрес есть автоматическое переключение мастеров

    Нет такого.
    Только внешние управляющие (patroni, например). Ну или в форках каких-нибудь, но это вопрос к этим форкам, а не к postgresql.
    Ответ написан
    Комментировать
  • Как сделать несколько count c разными фильтрами в sql?

    Melkij
    @Melkij
    PostgreSQL DBA
    select count(*) filter (where status = 'active'),
    count(*) filter (where status = 'offline') ...


    наиболее оптимально

    не делать count вовсе.
    Ответ написан
    2 комментария
  • Как отфильтровать данные по всем полям объекта json в Postgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    where exists(select from jsonb_each(variants) where (value->>'price')::numeric between 0 and 10);
    Ответ написан
  • Как реализовать репликацию БД в Postgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    Точно искали?

    CREATE ROLE replica WITH REPLICATION PASSWORD 'password' LOGIN
    проверить listen_addresses (ещё wal_level = replica или logical и max_wal_senders, но они дефолтные уже подходящие), добавить pg_hba разрешение этому пользователю на replication псевдобазу

    С реплики pg_basebackup -D /path -R -U replica -h primary_addr
    Потом запустить базу на реплике, всё готово.
    Ответ написан
  • Хранение данных с датчиков. Как формировать UUID?

    Melkij
    @Melkij
    PostgreSQL DBA
    Зачем? Если вы хотите генерировать uuid на базе - возьмите сразу sequence. Нет причин использовать uuid в этом случае, а неприятные побочные эффекты будут.

    Пришлось играться с Autoincrement, раздвинуть диапазон, чтобы нужный участок влез

    Зачем?
    Взяли данные и вставили данные сгенерировав новые sequence. sequence даёт гарантированно уникальные значения.
    Ответ написан
    Комментировать
  • Как и чем настроить инкрементальный бэкап PostgreSQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    Судя по желанию делать бекап удивительно часто - вы пытаетесь найти PiTR.
    В целом: https://www.postgresql.org/docs/current/continuous...
    В частности: wal-g, barman, pgbackrest чтобы не собирать конструктор вручную.
    Ответ написан
    Комментировать
  • Какая БД лучше работает с репликацией master-master?

    Melkij
    @Melkij
    PostgreSQL DBA
    с репликацией master-master

    Выбираем в первую очередь между PostgreSQL и MongoDB

    А вы специально выбираете между СУБД в которых мультимастера штатно вообще нет?

    Если вы подразумеваете какие-то расширения или форки - то и называйте именно их. Один критерий который вам надо проверить вы придумали сами. Допустимое ограничение на лаг тоже назвали. Второй критерий - четко определите своё понимание "корректная". В момент времени t строка обновилась, в момент времени t+1мс та же самая строка обновилась ещё раз на другом сервере. Налицо конфликт репликации. Что делать? Вот этот случай для себя распишите какое вы хотите поведение.
    Ответ написан
  • Как сделать чтобы большая БД держала нагрузку?

    Melkij
    @Melkij
    PostgreSQL DBA
    Ооо.... Вы это сейчас вообще серьёзно?

    Если вы запускаете DBaaS платформу и не знаете что делать собственно с базами - то у вас не
    Запускаю свою облачную платформу, код и архитектура создана с нуля.

    У вас нет вообще абсолютно ещё ничего и уж архитектуры - в особенности. Кроме "идеи", над которой бьётся давно и много кто, при том имея ресурсы на собственные команды DBA.

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

    Значит этому юзеру достаточно ходить только на мастер.
    Для сферического в вакууме приложения нет средств автоматически распределять запросы по репликам. И такое сделать вовсе невозможно без накладывания ограничений на использование. Например,
    select somefunc();
    Что делает эта функция? Она только читает данные и потому можно отправить на реплику или она пишет и потому должна быть на мастере? Хотите правильный ответ от контрибьютора postgresql? Это достоверно не знает даже сама база до тех пор пока не выполнит функцию.

    Другой пример:
    begin isolation level repeatable read;
    select ...
    update ...
    commit;

    Как максимум на запросе select вы должны уже знать можете ли вы эту транзакцию отправить на читающую реплику. Откуда бы вам это узнать заранее?
    И прочие принципиально-нерешаемые вопросы.

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

    Melkij
    @Melkij
    PostgreSQL DBA
    select distinct on (price_id), price_id,value  from tablename order by price_id, time_action desc


    Если на каждый price_id много строк - то вы неверно думаете что запрос замедляет.
    select price_id, value from prices as t1 lateral (select value from test t2 where t1.id=t2.price_id order by time_action desc limit 1) on true;

    Если таблицы prices нет - то сооружать loose index scan вручную.
    Всё разумеется с подходящим индексом.
    Ответ написан
    Комментировать
  • Не получается сделать дамп pg_dump. Как разобраться с ролями в Postgres?

    Melkij
    @Melkij
    PostgreSQL DBA
    А смысл говорить про права если вы даже не подключились к базе?

    Хотите просто и не разбираться с правами - от postgres и снимайте дамп. sudo -u postgres pg_dump ...
    Ответ написан
    6 комментариев
  • Как выбрать данные из JSON в Postgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    select * from json_each('{"a":"foo", "b":"bar"}')
    https://www.postgresql.org/docs/current/functions-...
    Ответ написан
    Комментировать
  • Как собрать лог востановления БД PostgreSQL из dmp-файла?

    Melkij
    @Melkij
    PostgreSQL DBA
    > pg_restore_log.txt

    это stdout. А есть ещё stderr, куда всё интересное про ошибки и пишется. А так же verbose туда пишется, который вы запросили.
    cmd 2> stderr.log

    Ошибку пожалуй попробую даже угадать:
    - owner не superuser
    - у вас postgresql < 11.0
    - ошибка прилетает на plpgsql extension который в новой базе уже есть, но его пытается воспроизвести pg_restore
    Ответ написан
  • Postgres синхронная репликация?

    Melkij
    @Melkij
    PostgreSQL DBA
    Момент первый: какой synchronous_standby_names?
    Момент второй:
    репликация через настройку synchronous_commit = on

    https://www.postgresql.org/docs/current/runtime-co...
    When set to on, commits will wait until replies from the current synchronous standby(s) indicate they have received the commit record of the transaction and flushed it to disk.

    When set to remote_apply, commits will wait until replies from the current synchronous standby(s) indicate they have received the commit record of the transaction and applied it, so that it has become visible to queries on the standby(s).

    Разницу чувствуете?

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

    Очень необычный workload. Ни разу такого не встречал.
    Мне любопытно, что вы такое делаете, что вам неважна латентность записи, у вас тяжёлая пишущая нагрузка (не путать с объёмом пишущей нагрузки - репликам это всё писать придётся так же, но ещё и читать), очень много крайне критичного к лагу асинхронной репликации чтения.
    Ответ написан
  • О чем говорит результат запрса? Или какой вывод можно сделать?

    Melkij
    @Melkij
    PostgreSQL DBA
    О чем говорит state = active - запрос до сих пор не завершился

    О том что запрос выполняется.

    О чем говорит wait = lock и wait_event = transaction_id?

    Ожидаем результат другой транзакции.

    которая обновляет некоторые данные

    транзакция 1 обновила строку но ещё не завершилась.
    транзакция 2 хочет обновить ту же самую строку. Но какие данные она увидит? Те которые ещё не подтвердила транзакция 1 - нельзя. Вдруг транзакция 1 будет rollback? Те которые были до прихода транзакции 1 - тем более нельзя. Потому ждём пока не закончится транзакция 1.

    Найдите начало этого хвоста, например вот таким запросом
    Ответ написан
    2 комментария
  • Куда "потерялась" часть размера таблицы?

    Melkij
    @Melkij
    PostgreSQL DBA
    \dt+ показывает pg_catalog.pg_size_pretty(pg_catalog.pg_table_size(c.oid)) as "Size",
    pg_total_relation_size - это pg_table_size + размер индексов таблицы.

    Все они считаются здесь: https://github.com/postgres/postgres/blob/REL_11_S...
    Итого вы не посчитали размер индексов на toast. Как правило он там один

    слои файлов (main, fsm, vm)

    Это relation forks
    Ответ написан
  • Как работает кластеризация mysql или другой БД кластер?

    Melkij
    @Melkij
    PostgreSQL DBA
    Такой запрос будет очень медленный

    Почему? Ну если только table - это не таблица, а развесистый view.
    Если таблица - читаем потоком данные удобным для субд способом (сортировки не запрошено - субд выберет удобный для себя порядок чтения) и шлём запросившему. Простая штука, и если производительности не хватает здесь - то это вопрос не к базе и её масштабированию, а к приложению: зачем вообще понадобился там этот не детерминированный миллион строк из таблицы.

    Кластер - это слово очень общее.
    Мастер-реплика cold standby - кластер
    Мастер-реплика hot standby - кластер
    Мастер-мастер - кластер
    N шардов - кластер
    Гетерогенная система с двухфазным коммитом - всё равно кластер

    то что делает кластер

    Неправильный задаёте вопрос.
    Сначала определяете зачем вам головная боль, с какой целью вы хотите добавить второй сервер СУБД и почему вам недостаточно одного - затем смотрите в каком направлении вам необходимо для решения этой задачи двигаться.
    Ответ написан
    Комментировать
  • Ошибка при использовании Sqlalchemy + Heroku Postgresql DB?

    Melkij
    @Melkij
    PostgreSQL DBA
    Стена ненужного кода и текста там где достаточно лишь переводчика.
    there is no unique constraint matching given keys for referenced table "users"

    Переведите.
    Посмотрите на свои foreign key
    Найдите что СУБД возмущается конечно имея полные на то основания
    Ответ написан