Ответы пользователя по тегу PostgreSQL
  • Как замониторить банусер?

    Melkij
    @Melkij
    PostgreSQL DBA
    Нет, сам postgresql о существовании баунсера вообще не знает. pgbouncer является обычным libpq клиентом с точки зрения базы.
    Ответ написан
  • Необходим поменять формат времени в запросе, как?

    Melkij
    @Melkij
    PostgreSQL DBA
    формат времени с mysql на postgresql

    done by sql design.
    Форматы даты, времени, датывремени эквиваленты. И, емнип, вовсе стандартны для SQL в целом.
    Если вы пихаете данные в неподходящий тип данных вместо штатного для обеих субд timestamp - то вас будут ждать сюрпризы рано или поздно. Это как бы само собой разумеется.

    Если ваш clock, как очевидно по комментарию в другом ответе, int4 является количеством секунд с начала этой эпохи, то привести unixtime к циферке-количеству-секунд-этой-эпохи можно через extract:
    hs.clock > extract(epoch from timestamp 'yesterday')

    Привести циферку количества секунд в этой эпохе к timestamp можно функцией to_timestamp.
    Ответ написан
    2 комментария
  • Как мне отсортировать кверисет?

    Melkij
    @Melkij
    PostgreSQL DBA
    Какой запрос идёт в базу в результате?
    Если не указано никакого order by - то порядок записей в результате запроса любой. В смысле действительно любой, СУБД может даже на каждый запрос возвращать данные в разном порядке и это именно то, что сказано в стандарте SQL.
    Ответ написан
    Комментировать
  • Как выгрузить из бэкапа нескольких БД одну необходимую?

    Melkij
    @Melkij
    PostgreSQL DBA
    Как выгрузить из бэкапа нескольких БД одну необходимую?

    бэкап всех БД - all_databases.sql

    Никак.
    Либо идти руками и текстовым редактором доставать именно нужное.

    -U - существующий в postgresql пользователь, от имени которого можно зайти сейчас. А не после разворачивания бекапа. Для бекапа всего кластера очевидно понадобится суперпользователь, postgres или pgsql обычно.
    -d имя базы данных, а не таблицы. База так же должна уже существовать, чтобы можно было подключиться к pg.
    Ответ написан
  • Postgres не обновил sequence при вставке с PK?

    Melkij
    @Melkij
    PostgreSQL DBA
    Потому что не был вызван nextval. За ненадобностью.
    Раз не нужно было генерировать новое значение, то зачем его дёргать зря?
    Ответ написан
    6 комментариев
  • Как осуществить выборку повторяющихся событий из базы?

    Melkij
    @Melkij
    PostgreSQL DBA
    Если в лоб:
    select ... from events where exists (
        select 1 from generate_series(events.start_date, :target_end_date, events.repeat) as d(rep_date) 
        where rep_date between :target_date and :target_end_date
    );

    Как сделать быстро сходу не сообразил.
    Ответ написан
    Комментировать
  • Как правильно подсчитать примерное количество строк через EXPLAIN?

    Melkij
    @Melkij
    PostgreSQL DBA
    Поизучайте как именно работает статистика планировщика. Ну, например, https://habrahabr.ru/company/pgdayrussia/blog/329542/
    Есть default_statistics_target (дефолт 100) и именно столько штук самых популярных конкретных значений отслеживается в most_common_vals и most_common_freqs. Что можно сказать про все остальные значения? (число разных значений есть - n_distinct) Что они как-то могут быть распределены по (100%-sum(most_common_freqs)) оставшимся строкам. В сущности, в статистике нет других значений кроме most_common_vals и потому нельзя сказать, есть ли вообще хоть одно искомое значение. А как они там распределены, если есть? Да кто их знает. Планировщик предполагает, что примерно равномерно.

    Соответственно можно крутить default_statistics_target для конкретного поля или индекса.
    Ответ написан
    1 комментарий
  • Репликация. Правильно ли я понимаю?

    Melkij
    @Melkij
    PostgreSQL DBA
    гарантирует ACID где буква «C» означает Consistency — Согласованность.

    В пределах одного кластера postgresql. Т.е. одного сервера.

    возможна ли ситуация когда ключи «X» и «Y» уже реплицированны на сервер «B», но еще не реплицированны на сервер «C»? При асинхронной репликации?

    By design. Потому это и названо асинхронной репликой. Между коммитом на мастере и приходом каждого отдельного асинхронного слейва в это состояние всегда будет какой-то временной лаг.
    Но timeline один на всех, т.к. его ведёт мастер. Ситуация, что на B записан только X, а на C только Y - исключена.

    Синхронная реплика - мастер не ответит клиенту "записано" пока не получит отклик от синхронных реплик из synchronous_standby_names, что те получили эти wal (дефолт, гарантирует, что данные есть минимум на двух машинах и при внезапном сбое вы их не потеряете), применили эти изменения (synchronous_commit=remote_write соответственно два кластера postgresql синхронны. Из-за CAP теоремы теоретически возможно, что при сбое мастера на слейве эта транзакция будет уже записана, а на мастере значится как прерванная. Не знаю, что именно по этому поводу сделано).
    Внимание, что при потере работоспособности синхронной реплики мастер будет доступен только на чтение. Все пишущие транзакции будут ждать возвращения синхронной реплики.

    Гарантируется ли согласованность в системе из нескольких реплицируемых серверов?

    Смотря чем вам допустимо жертвовать для этого. См. CAP теорему.

    Это, разумеется, справедливо только для встроенной бинарной потоковой репликации WAL. Логическая в 10 будет жить по своим особым правилам, как и сторонние триггерные решения.
    Ответ написан
    Комментировать
  • Как из таблицы получить массив в postgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    select array_agg(field) from test
    ?
    Ответ написан
    Комментировать
  • Как инициализировать файлы Postgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    sudo rm -rf /var/lib/postgresql

    Это был home dir пользователя, а не каталог кластера. Каталог кластера в дефолтной поставке в /var/lib/postgresql/версия_pg/ещё_одна_директория_main_или_base

    sudo mkdir /media/ad/data/bd1c

    Допустим.

    su postgres -c '/usr/lib/postgresql/9.6/bin/initdb -D media/ad/data/bd1c --locale=ru_RU.UTF-8'

    Внимание на относительный путь. Я не уверен, где в итоге initdb пытался сделать базу.

    привел к виду
    data_directory = '/var/lib/pgsql'

    ? Откуда это здесь взялось?

    какой из postgresql.conf главнее

    Тот, который указан в аргументах запуска postgres. Явным образом через -c config_file либо находящийся в PGDATA в случае отсутствия аргумента с именем конфига.
    Ответ написан
    Комментировать
  • Журналирование в mongodb и postgresql - правильно ли я его понимаю?

    Melkij
    @Melkij
    PostgreSQL DBA
    Точно про актуальную монгу сказать что-то затрудняюсь.
    Про версию постарше цитата про вторую версию монги
    MongoDB v2.0 will consider a write to be complete, done, finito as soon as it has been buffered in the outgoing socket buffer of the client host.

    Отвечает "записано", когда данные даже не покинули машину клиента, не то что записаны хоть куда-нибудь.
    С таким подходом задумывались ли авторы над потерей данных вообще и исправлено ли сейчас?

    и тут я вспомнил что у postgresql есть параметр wal_writer_delay = 200ms, что-же получается и у postgresql может быть такая ботва что клиент думает что строка сохранена а все накрылось до сброса журнала на диск???

    Если вы намеренно выкрутили гайку synchronous_commit.

    fsync - это очень дорого. Даже на SSD.
    Поскольку это дорого, делаются какие-нибудь фокусы. Магнитные диски ненавидят случайную запись и куда лучше относятся к последовательной. Поэтому и тут тоже придумывают какие-то фокусы.
    В итоге postgresql (если вы сами не отстрелили себе ноги) пишет wal в память, отдельный процесс каждые wal_writer_delay просыпается, сбрасывает на диск накопленные wal и отмечает, в какой позиции wal гарантированно доехал до диска fsync. Поскольку synchronous_commit включен, то перед ответом клиенту "записано" воркер ждёт, пока его данные не будут записаны на диск. После этого отвечает приложению "записано".
    https://www.postgresql.org/docs/current/static/run...
    synchronous_commit (enum) Specifies whether transaction commit will wait for WAL records to be written to disk before the command returns a "success" indication to the client
    Ответ написан
    2 комментария
  • Какой должен быть размер базы при дампе?

    Melkij
    @Melkij
    PostgreSQL DBA
    Во-первых, индексы. В sql-дампе любой индекс - это несколько десятков байт запроса на создание индекса. В базе - это развесистая структура, которая может занимать порядочно места. Один индекс обычно небольшой - но у вас же он не один?
    Во-вторых, как уже упомянули - бинарные файлы могут быть раздуты из-за delete и update запросов, если плохо настроен автовакуум. Касается как самих таблиц, так и индексов.
    Третье: например табличка связей из тройки интов. В pg_dump данные пишутся через copy - один заголовок, следом все строки, значения разделены табуляцией. Итого 3 байта на строку данных оверхеда + строковое представление значения. В реальной таблице - у каждой строки есть заголовок из 23 байт. Плюс выравнивание данных. Итого минимум будет 36 байт на каждую строку. (описание структуры таблицы опять же отдельно хранится) Т.е. текстовый вид внезапно компактнее почти на всём диапазоне значений инта для этой таблички.

    Так что да, текстовый дамп может весить сильно меньше бинарного за счёт исключения всех служебных структур.
    Ответ написан
    1 комментарий
  • Почему DISTINCT ON так медленно выполняется?

    Melkij
    @Melkij
    PostgreSQL DBA
    Ускорить можно вот такой милой рекурсивной cte'шкой: https://wiki.postgresql.org/wiki/Loose_indexscan
    Нативно pg пока не умеет loose indexscan. Поэтому distinct читает все элементы дерева вместо поиска следующего большего элемента.
    Ответ написан
  • Как убедить PostgreSQL использовать индекс?

    Melkij
    @Melkij
    PostgreSQL DBA
    у меня есть таблица, в которой уже есть список уникальных меток

    try this:
    select label, latest_stamp from labelstable lateral (
        select timestamp as latest_stamp from tablename where tablename.label = labeltable.label
        order by timestamp desc limit 1
    ) l

    Postgresql 9.3 или выше.
    Loose index scan по самой таблице тоже можно сделать, он просто будет более многословным.
    Ответ написан
    1 комментарий
  • Как сформировать выборку уникальных объектов в массив?

    Melkij
    @Melkij
    PostgreSQL DBA
    select json_agg(json_build_object('id_user', id_user, 'data', d)) from (
        select id_user, json_agg(json_build_object('data', val, 'type', type)) as d from (
            select id_user, type, val from tt group by id_user, type, val
        ) t group by id_user
    ) s;
    Ответ написан
    4 комментария
  • Как сформировать выборку в массив из повторяющихся записей?

    Melkij
    @Melkij
    PostgreSQL DBA
    select id_user, array_agg(data) from tablename group by id_user

    Можно и сразу json собрать. С оглядкой на версию базы только.
    select json_agg((
    select json_build_object('id_user', id_user, 'data', json_agg(data)) from tablename group by id_user
    ));
    Ответ написан
    7 комментариев
  • Как ускорить RETURN QUERY EXECUTE?

    Melkij
    @Melkij
    PostgreSQL DBA
    Зачем здесь query execute? Запрос же статичен.
    RETURN QUERY SELECT "id", "name" FROM "mytable" WHERE date BETWEEN t1 AND t2;

    Впрочем, планировать 1,7с тут в общем-то нечего, так что это спички.

    Вообще, вызов хранимки материализуется. Рабочая гипотеза - на материализации время и тратите. Что дальше происходит с данными? В explain что-нибудь полезное видно? (давненько я хранимки не разбирал, не помню, что туда попадает)
    Ответ написан
  • Как исправить character with byte sequence 0xd0 0x92?

    Melkij
    @Melkij
    PostgreSQL DBA
    Поскольку postgresql сказал, какие это кодировки - значит он о них знает. Самое очевидное - у вас разные кодировки соединения и самой базы данных.

    Сама ошибка говорит о том, что в кодировке latin1 нет эквивалента для символа. Чтобы не иметь себе мозг многими проблемами - пересоздайте (да, именно пересоздайте, кодировка БД может выбираться только при создании БД) базу данных с кодировкой UTF8.
    Ответ написан
    Комментировать
  • Как правильно написать запрос на выборку из базы PostgeSQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    Если только поправить запрос, который у вас на той же схеме работает в mysql:
    SELECT p.phone,
    count(1) filter(where i.status=7 ) as saled,
    count(1) filter(where i.status=3 ) as no_saled
    FROM items as i
    INNER JOIN phones as p
    ON i.user_id=p.users
    WHERE p.phone IN("7924445544", "8985545444")
    GROUP BY p.phone;


    Если же схема другая - то синтаксисом int[] обозначается массив из integer, такой штатных тип данных. В mysql такого нет. У вас именно массив чисел?
    Ответ написан
    1 комментарий
  • Есть ли в оконных функциях PostgreSQL аналог Ораклового count?

    Melkij
    @Melkij
    PostgreSQL DBA
    postgresql не делает явных различий между аггрегирующими и оконными функциями. Как оконную можно использовать любую аггрегирующую функцию (кроме указанных с списке (или своих реализованных как) Ordered-Set и Hypothetical-Set).

    any built-in or user-defined normal aggregate function (but not ordered-set or hypothetical-set aggregates) can be used as a window function

    https://www.postgresql.org/docs/current/static/fun...
    Ответ написан
    Комментировать