Задать вопрос
Ответы пользователя по тегу PostgreSQL
  • Есть ли в PostgreSQL 11 планировщик задач из коробки?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Нет, такого нет. Потому что непонятно зачем нужно.

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

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    с 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
    DBA Team для вашего PostgreSQL?
    Планировщик Postgresql на данный момент не умеет loose index scan. Поэтому планировщик вполне обоснованно со своей точки зрения выбирает не использовать какие-либо индексы.

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

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

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

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

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

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

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

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

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

    В списке переводов вижу:
    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
    DBA Team для вашего PostgreSQL?
    с помощью утилиты 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
    DBA Team для вашего PostgreSQL?
    Сначала сделать copy в другую табличку с текстовыми полями (temporary table вполне подходящее место), затем insert .. select запросом перенести куда надо с любыми манипуляциями по пути.

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

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Нет, не создаётся. На той таблице, на которую FK ссылается индекс уже должен быть создан уникальный, на той таблице которая ссылается наличие индекса никак не проверяется и даже не требуется. Надо только понимать, что FK - for each row триггеры и без индекса будет N seqscan таблицы.

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

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Суть такова, что есть прайс(ы) ~5млн и его нужно быстро обновлять (раз в 2 часа).

    Это НЕ много и совсем НЕ часто.

    обновлять или удалять и заново записывать

    Ложный выбор, это одна и та же операция. MVCC update = delete + insert
    Но что важно - не делать update который вам действительно не нужен. Postgresql не анализирует данные в поиске пустых обновлений, update table set id = id; вам честно удвоит таблицу, хотя ничего на логическом уровне не изменится.

    Профилируйте, на что реально тратите время - pg_stat_statements ответит хорошо на этот вопрос со стороны базы. Пальцем в небо - вы работаете в автокоммите и естественно 5млн пишущих операций для любой честной ACID базы - это порядком медленного IO (даже для SSD)
    Ответ написан
    4 комментария
  • Как исправить ошибку postgresql?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Прежде всего проверьте версию СУБД. json_array_elements_text была добавлена в релизе 9.4.
    Ответ написан
    8 комментариев
  • Раздельный дамп базы, как организовать?

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

    Ну а по логическому дампу - записать данные и построить индексы или добавить индексы, а потом писать данные - две очень большие разницы.
    Поскольку речь о статистике - нарежьте статистику на партиции, можно в отдельный schema их пихнуть для удобства. Основную базу соответственно дампите с исключением данных партиций, затем заполняете разделы данными и пристёгиваете их к основной табличке. Или, что лучше, дампите в более подходящие format custom или directory всю базу, затем восстанавливаете параллельно с --exclude-schema и отдельно разделы статистики.
    Ответ написан
    Комментировать
  • Как спрятать таблицы для пользователя?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Никак.
    Ответ написан
    Комментировать
  • Какой тип данных выбирать для ID в PostgreSQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Как я понял для ID лучше выбирать int, а не smallint.

    Тип необходимо выбирать соответствующий данным.
    Например, для идентификатора страны int будет явно избыточен. А где-то и int мало и нужен bigint

    2. Для названия акции есть тип character varying(n), varchar(n) Нужно ли задавать его длину? Или можно оставить поле пустым?

    Это вопрос к вам как автору схемы базы.

    3. Как влияет задание длины поля на экономию места в базе?

    Никак. Это просто дополнительное ограничение данных.
    varchar и text - типы с переменным размером, занимают столько места, сколько данных записано.

    Например сейчас все названия акций не более 10 букв, а что будет, если в будущем появится название из 30 букв? Придется изменять длину строки? Можно ли так делать, когда база уже частично заполнена?

    Увеличивать размерность возможно и это быстрая операция.

    4. Для чего ставить поле -Not null?

    Дополнительное ограничение на данные, запрещающее ставить специальное значение NULL, то есть "нет значения". Использовать или не использовать NULL - решение автора схемы базы.
    Если вы попытаетесь записать NULL в поле отмеченное not null - будет ошибка и ничего записано не будет.
    Ответ написан
    1 комментарий
  • Почему у меня возникает ошибка при доступе к определённой базе данных PostgreSQL 11 из IntelliJ IDEA 2018.1?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Ваше приложение ещё не поддерживает вышедший в четверг postgresql 11. Возможно обновление уже выпущено, я так догадываюсь версия 2018.1 была довольно давно.

    proisagg и proiswindow были удалены из системного каталога pg_proc ещё в марте до feature freeze и эти изменения вошли в postgresql 11.
    Ответ написан
    Комментировать
  • Какие типы данных выбирать для новой базы данных для экономии места?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Вероятно вы путаете понятия база и таблица. Иначе непонятно, что вы имеете в виду говор о FK между базами.

    Если цель оптимизировать занимаемое место для явно timeseries данных - то и используйте timeseries базы.
    Полновесный версионник с 23 байтами оверхеда на один только заголовок каждой строки (ещё не начиная считать данные, плюс выравнивание структур) сильно сомнительно что окажется компактнее ориентированных на timeseries данные базы.
    Ответ написан
    1 комментарий
  • Postgresql - как включить логирование запросов?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    rpm-based (redhat, centos) и deb-based (debian, ubuntu) ставят postgresql разным образом. Поэтому детали различаются.

    PGDATA вида /var/lib/pgsql/9.6/data/ характерен для centos. Конфиг базы при этом лежит здесь же.
    ubuntu кластер по умолчанию кладут в /var/lib/postgresql/9.6/main/
    Логи в ubuntu по умолчанию будут писаться в /var/log/postgresql/postgresql-9.6-main.log , а конфиг - в /etc/postgresql/9.6/main/postgresql.conf

    В общем-то, вопроса тут два:
    найти куда пишутся логи базы либо изменить настройки, чтобы логи писались туда куда вы хотите. Это никак не связано с включением логирования запросов, это где логи в целом. Если у вас причина менять настройки места логирования - то вы уже должны представлять зачем.
    включить логированиие запросов: настройка log_min_duration_statement позволяющий логировать запросы дольше указанного времени (0 - все запросы) или log_statement, логирующая всё указанного типа (например, все DDL)

    При том практика centos писать логи в каталог базы в некотором отношении порочна: эти логи будут попадать в pg_basebackup, где им делать в общем-то совершенно нечего и незачем.
    Ответ написан
    1 комментарий
  • Portage SQL: найти различия реально?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Зачем вам Portage SQL вообще в винде?
    Наверное, речь всё-таки о PostgreSQL.

    Сравнение двух таблиц - банальный стандартный FULL OUTER JOIN
    select * from t1 full outer join t2 using(id) where (t1.*) is distinct from (t2.*);

    Сравнение баз - вероятно удобнее будет чем-то внешним.
    Ответ написан
    Комментировать
  • Возможно ли вывести количество уникальных слов в таблице?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    select lexeme, count(*) from tabledata cross join unnest(to_tsvector(data)) as lexemes group by 1;

    ?

    gin_trgm_ops - НЕ полнотекстовый индекс и не производит деление по словам. Это pg_trgm extension с реализацией триграмного поиска. Имеет отношение к тексту, но совсем не fulltext search.
    Ответ написан
    Комментировать
  • Умеет ли postgres в асинхронные запросы?

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

    Будут ли запросы в самой базе сериализоваться в очередь либо выполняться параллельно - вопрос к этим самым запросам. Читающие довольно сложно чем-то заблокировать, пишущие чаще могут конфликтовать за блокировки.
    Ответ написан
    Комментировать