Ответы пользователя по тегу PostgreSQL
  • Создается ли автоматически индекс при создании foreign key в PostgreSQL 10?

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

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

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

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

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

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

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

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

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

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

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

    Melkij
    @Melkij
    PostgreSQL DBA
    Как я понял для 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
    PostgreSQL DBA
    Ваше приложение ещё не поддерживает вышедший в четверг postgresql 11. Возможно обновление уже выпущено, я так догадываюсь версия 2018.1 была довольно давно.

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

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

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

    Melkij
    @Melkij
    PostgreSQL DBA
    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
    PostgreSQL DBA
    Зачем вам Portage SQL вообще в винде?
    Наверное, речь всё-таки о PostgreSQL.

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

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

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

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

    Melkij
    @Melkij
    PostgreSQL DBA
    Смотрите explain (analyze, buffers), сильно желательно с включенным track_io_timing. Почти наверняка первый запрос вы читаете с диска, второй - уже из shared_buffers. Либо с page cache операционной системы.
    Ответ написан
  • Чем чреват запуск 2 инстансов Postgresql одной версии на одном сервере?

    Melkij
    @Melkij
    PostgreSQL DBA
    Никаких. Совсем никаких. Это штатный вариант работы, есть даже штатная настройка cluster_name, которая будет выводиться в списке процессов для лёгкости идентификации, на какой именно кластер вы смотрите. Для debian/ubuntu - управляется вовсе стандартными штатными утилитами pg_ctlcluster.

    Нужны разные datadir и не пересекающиеся сетевые настройки
    Ответ написан
    3 комментария
  • Как получить список чисел отсутвующих в базе PostgreSQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    Нужен опорный список значений и not exists подзапрос. Опорный список можно сделать через generate_series функцию
    select n from generate_series(1,11) as n
    where not exists (select from tablename where id = n)
    Ответ написан
  • Почему не могу выбрать пользователя в PostgreSQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    Выдает ошибку Peer authentication failed for user.

    Следовательно первым подходящим правилом для аутентификации в pg_hba.conf является строка с peer типом проверки - то есть пользователь операционной системы должен иметь то же имя, что и запрашиваемый пользователь базы.

    Вам необходимо изменить свой pg_hba и перечитать конфиг. reload достаточно.
    Как именно менять - определяется тем, какие именно вам нужны ограничения доступа.
    Ответ написан
    2 комментария
  • Как сделать поиск по колонке с json данными?

    Melkij
    @Melkij
    PostgreSQL DBA
    Обновляйтесь до postgresql 10 и будет вам полновесный full-text search по json быстро и по индексам: https://wiki.postgresql.org/wiki/New_in_postgres_1...

    А для 9.6 - можете посмотреть jsquery extension, может умеет чего полезного.
    Или вручную перебирать структуру, хранимкой на любом языке или запросом через jsonb_each_text и прочие.
    Ответ написан
    Комментировать
  • PostgreSQL Как сравнить время?

    Melkij
    @Melkij
    PostgreSQL DBA
    Практически буквально так и пишется:
    SELECT * from cc_files WHERE lptime < now() - interval '1 hour'
    Ответ написан
    Комментировать
  • В какой момент нужно что-то делать?

    Melkij
    @Melkij
    PostgreSQL DBA
    2 млн записей - это такие копейки.
    Что-то делают обычно когда проект не влезает в описание "сейчас никаких проблем".

    Что основное можно сделать:
    покрутить настройки checkpointer (чтобы checkpoint срабатывал реже - резко меньше random i/o, но при крахе база может дольше стартовать), autovacuum (опустить оба scale_factor куда-нибудь в 0.05 - чтобы автовакуум запускался чаще, но делал меньше работы, плюс уменьшить autovacuum_vacuum_cost_delay - это зависит от дисков)
    shared_buffers где-то в 25% от объёма RAM
    включить pg_stat_statements и поглядывать топ запросов оттуда
    Ответ написан
    1 комментарий
  • Как очистить столбец таблицы postgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    Как вы себе это представляете? truncate выкидывает файлы и выделяет пустые. А для колонки? Это не колоночная СУБД.

    Можно сделать так:
    begin;
    alter table tablename drop column foo;
    alter table tablename add column foo ...
    commit;

    Можно создать таблицу через create table as select и потом подменить старую новой.
    Ответ написан
    Комментировать