Ответы пользователя по тегу PostgreSQL
  • Что такое WITH при создании пользователя в Postgres?

    Melkij
    @Melkij
    PostgreSQL DBA
    Мусорное ключевое слово для совместимости со стандартом.
    От него ничего не зависит, ничего не делает.

    Если умеете читать грамматику: https://github.com/postgres/postgres/blob/REL_10_S... opt_with чуть ниже, никаких действий уже на этапе парсера, что он есть, что его нет.
    Ответ написан
    Комментировать
  • При асинхронной репликации postgresql-10 можно ли изменить конфиг слейва под другое железо или это исключено?

    Melkij
    @Melkij
    PostgreSQL DBA
    Для потоковой репликации необходимо, чтобы на реплике были установлены следующие настройки:
    wal_level с мастера не ниже replica
    max_connections, max_worker_processes, max_prepared_transactions, max_locks_per_transaction равные или больше чем на мастере.
    Для порядка упомяну, что аппаратная архитектура процессора должна быть идентичная, с x86-64 на arm реплицировать не выйдет.
    Всё остальное может различаться. Главное чтобы диски на репликах успевали писать поток изменений.
    Ответ написан
    Комментировать
  • Дублируются значения при запросе с generate_series и left join?

    Melkij
    @Melkij
    PostgreSQL DBA
    Запрос в вопросе делает cross join views на items и разумеется данные в результате будут совершенно верные, но бессмысленные.

    Не думаю, что перебирать потенциально большие views и items полностью не прокидывая заведомо известные условия поиска по датам - хорошая мысль даже для аналитического запроса.
    select d as day,
    (select count(*) from views where created_at >= d and created_at < (d + interval '1 day')) as views_count,
    (select count(*) from items where created_at >= d and created_at < (d + interval '1 day')) as items_count
    from generate_series('2018-12-26'::date, '2018-12-30', '1 day' ) as dates(d)
    order by day desc

    Либо похожим образом
    select d as day, views_count, items_count
    from generate_series('2018-12-26'::date, '2018-12-30', '1 day' ) as dates(d)
    left join lateral (select count(*) as views_count from views where created_at >= d and created_at < (d + interval '1 day'))  as v on true
    left join lateral (select count(*) as views_count from items where created_at >= d and created_at < (d + interval '1 day'))  as i on true
    order by day desc

    И посмотреть, что по этому поводу думает планировщик
    Ответ написан
    Комментировать
  • Как можно на ProgreSQL ограничиться одной функцией при формировании JSON?

    Melkij
    @Melkij
    PostgreSQL DBA
    json_agg есть нативный, если я верно понял о чём вы.
    Ответ написан
    Комментировать
  • Postgresql, как сделать запись на слейв?

    Melkij
    @Melkij
    PostgreSQL DBA
    Никак. Реплика строго readonly.
    Ответ написан
    Комментировать
  • Как сделать пакетную вставку данных в таблицу без конкатенации строк?

    Melkij
    @Melkij
    PostgreSQL DBA
    Например,
    insert into order_product_link (order_id, product_id) select 1, i from unnest(array[1,4,7,86]) as i;

    Как передать массив из go в массив postgresql - не подскажу. Уточняйте в используемой библиотеке go.

    Или copy from stdin и шлёте столько строк в copy сколько надо.
    Ответ написан
    Комментировать
  • Как осуществлять быстрый поиск по вхождениям?

    Melkij
    @Melkij
    PostgreSQL DBA
    Поиск точного вхождения подстроки в строку? LIKE '%...%'
    Плюс триграммный индекс из pg_trgm contrib
    Ответ написан
  • Как скорректировать время в результате select?

    Melkij
    @Melkij
    PostgreSQL DBA
    В таблице есть столбец с данными типа timestamp.
    Время там хранится UTC

    Мигрируете на timestamp with time zone
    Затем проставляете желаемый set timezone to '...'; и получаете всю обработку для timestamp with time zone корректную в этом часовом поясе.

    не красиво перечислять их все ради того, чтобы скорректировать один.

    Красиво - это перечислить явно и только те поля, которые в результате вам нужны.
    Если в этом дурацком засилье orm вы пишете запрос руками - значит вы явно должны знать, что именно и зачем вы хотите прочитать. Следовательно, select * показывает явный антипаттерн.
    Ответ написан
  • Postgresql-10 как работает логическая репликация из коробки(вопросы по теме под катом)?

    Melkij
    @Melkij
    PostgreSQL DBA
    1) Можно ли создать логическую репликацию на уровне схемы

    Нет.
    Ответ есть даже в мануале: https://www.postgresql.org/docs/10/sql-createpubli...
    Банально нет даже синтаксиса для создания публикации схемы.

    2) Связи между таблицами также будут реплицыроватся?

    Что вы имеете в виду?
    DDL вы переносите на подписчиков сами. Реплицируются только данные
    TRUNCATE and DDL operations are not published.

    truncate начали реплицировать в pg11. Репликации DDL нет и не будет как минимум ещё в pg12, на данный момент нет ни черновых патчей ни даже обсуждений таковой реализации.

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

    PS: есть некоторая терминологическая путаница, как англоязычная так и русскоязычная, schema и схема как namespace или schema и схема говоря о структуре базы, т.е. DDL
    Ответ написан
    Комментировать
  • Насколько like с процентом на конце эквивалентен between?

    Melkij
    @Melkij
    PostgreSQL DBA
    Если задумку реализовать корректно - то эквивалентны. Должны быть. У вас пока не эквивалентны, потому что
    melkij=> select '\uFFFF';
     ?column? 
    ----------
     \uFFFF

    Так unicode escapes не пишутся. E'\uFFFF'

    Хотя обычно берут штатный text_pattern_ops и like работает нормально.
    Ответ написан
    1 комментарий
  • Как работать с БД Postgres и 1с?

    Melkij
    @Melkij
    PostgreSQL DBA
    Долго и мучительно раскуривайте эту кладезь бреда и авгиевы конюшни говнокода под названием 1с.
    Эти люди в принципе не умеют работать с СУБД. И в базе там абсолютный ад и бардак, всё верно.

    Скорей всего значительно лучше будет отказаться от этой затеи и сделать отдельно экспорт нужных данных. И пересекаться с этой поделкой только через узкую прорезь экспорта, с непременной валидацией всех проходящих данных без исключения.
    Ответ написан
    3 комментария
  • Сколько максимально коннектов может выдержать postgresql-9?

    Melkij
    @Melkij
    PostgreSQL DBA
    А сколько у вас ядер на железке, чтобы пускать параллельно 1000 запросов? Хотя бы сотня ядер CPU под такое есть, чтобы за каждое ядро дрались и мешали друг другу всего десяток процессов?

    Если хотите снизить латентность - сохраняйте уже открытые соединения.
    Если хотите повысить пропускную способность - уменьшайте число активных процессов.
    Очень сильно лучше и то и другое сразу. Поэтому да, pgbouncer. Или хотя бы разумных размеров пул на приложении.
    Ответ написан
    2 комментария
  • Есть ли в PostgreSQL 11 планировщик задач из коробки?

    Melkij
    @Melkij
    PostgreSQL DBA
    Нет, такого нет. Потому что непонятно зачем нужно.

    Если сможете аргументированно указать сообществу, что такая штука зачем-то нужна - welcome. Потом найти заинтересованного разработчика (ну или самостоятельно), кто возьмётся за обсуждение пользовательского интерфейса, напишет патч и доведёт его до согласия с как минимум одним коммитером при отсутствии резких возражений от остальных участников сообщества.
    Сейчас готовится pg12, никаких обсуждений планировщиков задач нет. Поэтому маловероятно, что появится и в pg13 релизе.
    Ответ написан
    1 комментарий
  • Как правильно заресторить postgres cluster?

    Melkij
    @Melkij
    PostgreSQL DBA
    с pg_basebackup

    Важна конфигурация.

    Варианта есть два:
    - у вас есть архив WAL, который пишется из archive_command/archive_mode. Тогда указываете в recovery.conf restore_command, который будет тянуть WAL из этого вашего настроенного архива
    - у вас нет архива WAL. Тогда вы обязаны вызывать pg_basebackup с -X stream (емнип, это дефолт начиная с 10, но лучше указывать всё равно явно). Или хотя бы с -X fetch - но гарантий в этом случае никаких.

    Без WAL старт невозможен.
    Ответ написан
  • Как ускорить запрос с DISTINCT в PostgreSQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    Планировщик Postgresql на данный момент не умеет loose index scan. Поэтому планировщик вполне обоснованно со своей точки зрения выбирает не использовать какие-либо индексы.

    Поэтому если необходим именно distinct по не очень селективному полю - то эффективнее объяснить планировщику что от него хотят руками: https://wiki.postgresql.org/wiki/Loose_indexscan

    Вам же скорее необходимо менять схему хранения данных.

    Возможно в самом запросе нужно явно указать, чтобы использовался индекс. Как это сделать в PostgreSQL?Возможно в самом запросе нужно явно указать, чтобы использовался индекс. Как это сделать в PostgreSQL?

    Никак. Сообщество сознательно PostgreSQL отказывается добавлять какие-либо хинты планировщика, предпочитая узнавать об ошибках планировщика как о багах и по возможности их исправлять.
    Ответ написан
    5 комментариев
  • Как продемонстрировать MVCC в Postgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    t1
    begin;
    t2
    begin;
    update tablename set foo = 10;
    t1
    select * from tablename; -- не ждём блокировку, не видим результаты изменений из t2. Такое только в MVCC и бывает.
    Ответ написан
  • Как реализовать миграцию больших таблиц без блокировок?

    Melkij
    @Melkij
    PostgreSQL DBA
    Можно я сошлюсь на своё сочинение на SO? https://ru.stackoverflow.com/q/721985/203622

    Впрочем пару слов добавлю:
    добавив к примеру столбец

    Важно какой именно. Если default null - просто берёте и добавляете со statement_timeout в 1 секунду. alter table всё равно возьмёт блокировку на таблицу, но default null поле - это лишь быстрое обновление системного каталога.
    Если другой default - то для pg11 просто берёте и добавляете с таймаутом, для более старых немного приключений.
    Ответ написан
    2 комментария
  • Таймаут запроса postgresq?

    Melkij
    @Melkij
    PostgreSQL DBA
    Смотрите точное сообщение об ошибке. Лучше на языке оригинала, в переводе могли что-то потерять.

    В списке переводов вижу:
    msgid "canceling statement due to conflict with recovery"
    msgstr ""
    "выполнение оператора отменено из-за конфликта с процессом восстановления"
    --
    #, c-format
    msgid "canceling statement due to lock timeout"
    msgstr "выполнение оператора отменено из-за таймаута блокировки"
    --
    #, c-format
    msgid "canceling statement due to statement timeout"
    msgstr "выполнение оператора отменено из-за таймаута"

    "canceling statement due to statement timeout" - это строго про statement_timeout. Значит для той транзакции он не 0

    Запретить клиенту ставить самому себе таймаут невозможно. Ищите, где перед этим запросом таймаут выставляется.
    Ответ написан
    Комментировать
  • \. В sql файле?

    Melkij
    @Melkij
    PostgreSQL DBA
    с помощью утилиты pgsql

    Не знаю таких. Что это за утилита, что делает, как это делает?

    что значит \.

    Так помечается конец данных для COPY. https://www.postgresql.org/docs/current/sql-copy.html
    End of data can be represented by a single line containing just backslash-period (\.).


    емнип, php вовсе не может выполнять copy from stdin как запросы, только как функции PDO::pgsqlCopyFromArray для PDO или pg_put_line, pg_end_copy для php-postgresql расширения.
    Ответ написан
    Комментировать
  • PostgreSQL: Как добавить данные?

    Melkij
    @Melkij
    PostgreSQL DBA
    Сначала сделать copy в другую табличку с текстовыми полями (temporary table вполне подходящее место), затем insert .. select запросом перенести куда надо с любыми манипуляциями по пути.

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