Ответы пользователя по тегу PostgreSQL
  • Как сделать оптимизацию в добалении данных через (spring, hibernate, postgres)?

    Melkij
    @Melkij
    PostgreSQL DBA
    insert on conflict do nothing

    Возможно view с instead of statement trigger'ом, в view писать через copy, триггер будет делать insert on conflict
    Ответ написан
    Комментировать
  • Как выбрать последние записи для каждого raw_id?

    Melkij
    @Melkij
    PostgreSQL DBA
    select distinct on (raw_id) raw_id, id, single_sum 
    from tablename
    order by raw_id, id desc

    Может быть как обычно перепутал направление сортировки.
    Ответ написан
    Комментировать
  • GROUP BY и перечесление полей?

    Melkij
    @Melkij
    PostgreSQL DBA
    Это functional dependency. Если планировщик сможет свести ваши подзапросы или cte к уникальному индексу - functional dependency позволит ограничиться указанием только полей этого уникального индекса.

    Встречный вопрос: а зачем вам такая группировка вообще? Для приведённых запросов бесполезна и лишь вредна.
    Ответ написан
    3 комментария
  • Почему происходит дублирование запроса?

    Melkij
    @Melkij
    PostgreSQL DBA
    Проверьте сколько запросов делает непосредственно браузер.

    Например, фавиконка.
    Ответ написан
  • Где лучше ставить pgbouncer?

    Melkij
    @Melkij
    PostgreSQL DBA
    pgbouncer не имеет отношения к балансировке нагрузки. Вообще. Это pooler. В норме в transaction mode.

    Типично pgbouncer ставится на тех же хостах что и база, каждый смотрит только в свою локальную базу. Балансировка по баунсерам равнозначных реплик - что-то вроде haproxy или приложением.
    Ответ написан
    Комментировать
  • Как войти под пользователем?

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

    Для использования psql sudo не нужен. Нужны настройки pg_hba.conf и сам psql. Например, psql -U user1 database1
    Ответ написан
    5 комментариев
  • Можно ли в SQL создавать псевдонимы в конструкции where и использовать его в select?

    Melkij
    @Melkij
    PostgreSQL DBA
    Нужно получить диапазоны цен, где максимальная цена больше определенного числа.

    Мне кажется вам нужен вовсе:
    select product_id, min(price), max(price) from prices group by product_id having max(price)>= ?


    А отвечая на вопрос в лоб - lateral join'ом перенести подзапрос в секцию from и всё.
    Ответ написан
    1 комментарий
  • Centos7, как обновить postgresql с 9.2 до 10 версии?

    Melkij
    @Melkij
    PostgreSQL DBA
    Если база большая - pg_upgrade в link mode. В документации шаги вполне описаны. Желательно иметь реплику на всякий случай.
    Если база маленькая - pg_dumpall и импортировать в новую версию из дампа. Собственно всё просто: запустить новую базу на отдельном порту, снять дамп, залить дамп, остановить старую базу,, перезапустить новую на нужном порту.

    Просто запустить бинарники одной major версии на datadir другой major версии - не получится.

    Для обновления в пределах одного сервера нужны бинарники обеих версий СУБД. Инструкцию по установке уже расписал Alexey Dmitriev

    не ниже 10.1(на локалке у меня 10.1) или лучше ставить последнюю 12?

    10.11 минимум. Нечего тестировать давно закрытые ошибки.
    Ответ написан
    Комментировать
  • Как разграничить видимость данных в таблицах Postgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    RLS то что вы хотите услышать.

    Отдельный сервис между базой и неподконтрольными вам клиентами - то что вам необходимо сделать. База в мир открыта быть не должна. DoS делается довольно просто даже без знания паролей, а уж с доступом...
    Ответ написан
  • Postgres - не корректно работает SQL запрос(EXIST)?

    Melkij
    @Melkij
    PostgreSQL DBA
    Мне ещё со времён темы на sql.ru не хочется узнавать что это вы такое соорудили и зачем так сложно.

    Очень плохая мысль пытаться использовать одинаковые идентификаторы много раз. У вас либо весь запрос работает по принципу if exists subquery then взять все строки таблицы else пустое множество либо как-то переплетены между собой условия неочевидным образом из-за совпадения идентификаторов.
    Использовать exists как one-time filter в целом попробовать можно - но обычно exists по не коррелированному запросу есть ошибка.
    Ответ написан
  • Возможно ли настроить "автопартицирование" в PostgreSql?

    Melkij
    @Melkij
    PostgreSQL DBA
    Нет.

    PS: такие мелкие партиции скорей всего ухудшат производительность.
    Ответ написан
    Комментировать
  • Почему pgadmin орет на dblink?

    Melkij
    @Melkij
    PostgreSQL DBA
    Вы запросили select *, затем сказали что record возвращаемые функцией соответствуют по структуре одному полю типа numeric.
    Всё, в самом прямом смысле
    query result rowtype does not match the specified FROM clause rowtype


    pgadmin вовсе ни при чём, на запрос закономерно удивляется сам postgresql
    Ответ написан
    4 комментария
  • Как создать тип перечисления?

    Melkij
    @Melkij
    PostgreSQL DBA
    Чтож, зависит от того что именно вы хотите сделать.

    PostgreSQL позволяет сделать полностью собственную реализацию типа данных. Которая будет себя вести так как вы захотите - но всю эту логику вы должны разработать сами на C. Потому у create type и довольно объёмная документация.

    range типы - это диапазоны. Например, дата бронирования номера гостиницы. Таблица бронирований, одно поле с диапазоном дат tsrange и exclude constraint - всё, база проконтролирует, что даты бронирования не пересекаются.

    перечисления - это обычно подразумеваются enum. Но для вашей задачи это не подходит. enum - это фиксированный набор из строк.

    что-то похожее на штатные типы данных, но с ограничениями - вы хотели найти не create type, а create domain:
    CREATE DOMAIN smallint_between_10and200 AS smallint CHECK(value >= 10 and value < 200);

    Всё, теперь в таблицах вы можете использовать тип данных smallint_between_10and200, в который тем не менее записать что-то не из диапазона 10..200 будет невозможно.
    Ответ написан
    1 комментарий
  • Как проверить пустое ли поле?

    Melkij
    @Melkij
    PostgreSQL DBA
    Оператор сравнения в plpgsql такой же как в SQL. is null для проверки является ли значение null и = для равенства.

    Для изменения вставляемой строки вы должны модифицировать переменную new, а не пытаться уйти в бесконечную рекурсию выполняя аналогичную вызвавшему триггер операцию.
    Ответ написан
    3 комментария
  • Насколько дорогая SQL операция NOT IN/NOT EXISTS?

    Melkij
    @Melkij
    PostgreSQL DBA
    В таблице items 12 млн записей, в using_items 11 млн. Разумеется количество гипотетическое и маловероятное.

    Да нагенерируйте и посмотрите explain analyze. Были бы действительно объёмы, а не всего-то десяток миллионов строк.

    not in дорог из-за требования стандарта по части обработки NULL в not in и отсутствии специальных оптимизаций для этого случая. Может быть оптимизация появится.
    not exists оптимален.
    через left join план может быть идентичным not exists
    Ответ написан
    Комментировать
  • PostgreSQL как посчитать количество ключей в JSON?

    Melkij
    @Melkij
    PostgreSQL DBA
    select k, count(*) from tablename join  jsonb_object_keys(data) as k on true group by k

    ?
    Ответ написан
  • Как ускорить поиск?

    Melkij
    @Melkij
    PostgreSQL DBA
    Подумать, действительно ли нужен select *
    Если нет и нужно достать одно-два поля - запрашивайте только необходимые эти поля и добавьте их в индекс. В include для postgresql 11+ или в сам индекс после word. С учётом статичности самой таблицы будет index-only scan всегда.
    Если все нужны - то в принципе можно и в индекс вероятно загнать, но вряд ли в этом будет уже смысл.

    Можно ещё с hash-индексом попробовать если postgresql 10+. Но сомневаюсь.
    Ответ написан
    Комментировать
  • Как удалить строку из view таблицы в Postgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    Если материализованное view - то refresh materialized view
    Если не материализованное - то закешировано быть не могло. Смотрите определение view и исследуйте, откуда строка в резуультате этого запроса получается.
    Ответ написан
    Комментировать
  • Есть ли разница между выражением и транзакцией?

    Melkij
    @Melkij
    PostgreSQL DBA
    Можем ли мы быть уверены, что в следующей конструкции обновление обязательно произойдет (считаем что SELECT вернул какие-то данные)?

    Нет, не можем.
    Два конкурентных запроса могут увидеть одни и те же версии строк в cte (не пересекутся на читающих блокировках даже с конкурентными писателями т.к. mvcc) и затем пойдут обновлять одни и те же строки. На блокировках обновления строк их транзакции и сериализуются. Кстати, можно и deadlock словить если строк к обновлению будет несколько и они вернутся из запроса в разном порядке.

    приостановить запрос и посмотреть что будет, если произойдет X?

    gdb может приостановить всё что угодно. Правда далее уже интересный момент что надо найти куда именно break point ставить.
    Ответ написан
    Комментировать
  • Столбец удален, но не удален, как удалить столбец?

    Melkij
    @Melkij
    PostgreSQL DBA
    Мой хрустальный шар совершенно верно показал.
    Когда вы делаете add column columnname text - вы получаете NULL во всей этой колонке. Разумеется сразу после этого вы поставить NOT NULL не можете никак. Любая строка нарушает это ограничение и база отказывается ставить NOT NULL.
    Когда вы делаете add column columnname text NOT NULL - чтож, это может сработать в одном случае - у вас пустая таблица. Тогда ни одна строка не нарушает NOT NULL ограничение, у вас просто 0 строк. Если хоть одна строка есть - это невозможно. Вы просите default NULL и одновременно NOT NULL - так не бывает. В сообщении об ошибке говорится именно о добавляемой в этот момент колонке, не о какой-то другой существовавшей ранее.

    Вы должны указать какой-то не NULL default если хотите поставить NOT NULL на создаваемое поле. Либо очистить таблицу.
    Либо создать без NOT NULL, заполнить поле, потом уже делать NOT NULL.

    В postgresql действительно колонка не удаляется никогда. Но это деталь реализации и к сути вашего вопроса отношения не имеет.
    Ответ написан
    2 комментария