Задать вопрос
Ответы пользователя по тегу PostgreSQL
  • Как проверить последний используемый слот репликации postgresql 14?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Подумать над вопросом "зачем". Возьмите для имени слота лучше что-нибудь более предсказуемое, будет проще в скрипте и удобнее в сопровождении. Например, hostname этой реплики.

    Ну если хочется делать неудобно - берёте slot_name из pg_replication_slots, обрезаете ненужное, приводите к числу
    Ответ написан
    1 комментарий
  • Как вставить fk на запись, добавленную в этой же транзакции?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    это происходит в одной транзакции и видимо данные еще не видны

    Предположение ошибочно.
    Перепроверяйте внимательнее, что именно делаете. В частности, действительно ли в той же самой транзакции, говорит ли ошибка именно про это ограничение или может быть про другое.
    Ответ написан
    2 комментария
  • Откуда появляется бесконечный цикл?

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

    Вы делаете
    INSTEAD OF DELETE ON all_abonents

    и в этом триггере DELETE FROM all_abonents WHERE - почему же это не должно уходить в бесконечную рекурсию?

    Чем налагать спорные ограничения на действия из триггеров, postgresql будет послушно выполнять рекурсивные вызовы до исчерпания стека, а предоставлять условия выхода из рекурсии - задача разработчика.
    Ответ написан
    1 комментарий
  • Как быстро удалить Foreign Table в postgres?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Не могу удалить foreign table из postgres запросом

    Посмотреть в pg_blocking_pids, кто мешает. Сделать с этими соединениями что-нибудь (pg_terminate_backend, например)

    Если делать элементарный запрос SELECT * FROM fwd_orders LIMIT 500, то все исполняется за 600ms . А если в этот запрос добавить любой ORDER BY, то выполнение запроса идет 10 и более минут (в таблице более 20млн. строк). Почему так происходит? И как можно ускорить работу?

    Посмотреть explain (verbose) на предмет того, что считается локально, а что прокидывается на удалённую базу.
    В частности, уточнить у используемого расширения oracle fdw, реализован ли там push-down для order by. По описанию похоже что нет такого и потому вся таблица вычитывается и сортируется локально.
    Ответ написан
    Комментировать
  • Почему возникает ошибка "Final statement returns bigint instead of integer" в SQL функции?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Не соответствуют типы данных как они объявлены в выходных параметрах функции и тем, что вы пытаетесь делать в return. Должны соответствовать друг другу.

    sum у нас в pg13 существуют такие:
    melkij=> \da pg_catalog.sum
                                                  Список агрегатных функций
       Схема    | Имя | Тип данных результата | Типы данных аргументов |                     Описание                     
    ------------+-----+-----------------------+------------------------+--------------------------------------------------
     pg_catalog | sum | numeric               | bigint                 | sum as numeric across all bigint input values
     pg_catalog | sum | double precision      | double precision       | sum as float8 across all float8 input values
     pg_catalog | sum | bigint                | integer                | sum as bigint across all integer input values
     pg_catalog | sum | interval              | interval               | sum as interval across all interval input values
     pg_catalog | sum | money                 | money                  | sum as money across all money input values
     pg_catalog | sum | numeric               | numeric                | sum as numeric across all numeric input values
     pg_catalog | sum | real                  | real                   | sum as float4 across all float4 input values
     pg_catalog | sum | bigint                | smallint               | sum as bigint across all smallint input values

    Как видно, нет ни одного варианта, который бы возвращал int4

    Final statement returns too many columns действительно надо пояснять? Или прямым английским языком всё и так уже сказано?
    Ответ написан
    3 комментария
  • Как залогировать дату последнего создания MATERIALIZED VIEW?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Вопрос в заголовке и вопрос в описании - два совершенно разных вопроса.

    Аналогично прочим командам, на вопрос был ли выполнен запрос, отвечает PQresultStatus. Нужно уточнять у вашей библиотеки подключения, как проверить статус команды. Во многих случаях всё просто - если метод вернул управление (а не бросил исключение) - команда выполнена.
    Ответ написан
    Комментировать
  • Нужно ли удалять индексы перед изменением их типа?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    У индекса нет возможности изменения типа. Ни самого типа индекса (btree, hash, gin, gist) ни типов полей.
    Нужно сначала создавать новый индекс, затем удалять старый. Имена индексов при этом должны будут различаться. Сначала удалить, потом построить новый - чревато развлечениями на production, когда на время построения нового индекса уже нет старого индекса и потому ранее быстрые запросы едят 100% cpu и диска, превращая задачу построения нового индекса во что-то около невозможное. На dev машине, конечно, без разницы.

    Просто работаю через Valentina Studio и не совсем понятно что происходит под капотом.

    Сделайте log_statement = all (или ddl) - и увидите в логе базы, что приложение делает. Бывает полезно не только с gui всякими, но и с чрезмерно "умными" orm.
    Ответ написан
    Комментировать
  • Возможна ли проверка условия внутри ON CONFLICT DO UPDATE?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Описание синтаксиса весьма красноречиво намекает о реализации
    DO UPDATE SET ... WHERE condition

    melkij=> create temp table foo (item int primary key, d date, price numeric);
    CREATE TABLE
    melkij=> insert into foo values (1, '2021-07-30', 100) on conflict (item) do update set price = excluded.price, d = excluded.d where excluded.d > foo.d;
    INSERT 0 1
    melkij=> table foo;
     item |     d      | price 
    ------+------------+-------
        1 | 2021-07-30 |   100
    (1 строка)
    
    melkij=> insert into foo values (1, '2021-08-01', 110) on conflict (item) do update set price = excluded.price, d = excluded.d where excluded.d > foo.d;
    INSERT 0 1
    melkij=> table foo;
     item |     d      | price 
    ------+------------+-------
        1 | 2021-08-01 |   110
    (1 строка)
    
    melkij=> insert into foo values (1, '2021-07-20', 80) on conflict (item) do update set price = excluded.price, d = excluded.d where excluded.d > foo.d;
    INSERT 0 0
    melkij=> table foo;
     item |     d      | price 
    ------+------------+-------
        1 | 2021-08-01 |   110
    (1 строка)
    Ответ написан
    Комментировать
  • Как оптимизировать выполнение тяжелых запросов?

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

    Обычный nice. Процессная же модель, никаких проблем понизить приоритет конкретного процесса средствами самой ОС.

    Есть ли встроенные механизмы кэшированая, которым можно сказать, что для запроса Х нужно отдавать данные из кэша при вызове его чаще чем N минут\часов?

    Нет, кеша запросов нет. И не будет.

    ситуация когда с БД нужно собирать некоторую статистику и при этом сделать так, чтобы система не сильно тормозила

    Не смешивать OLAP и OLTP вообще. Если база важная, то у неё будет hot standby. Там статистику и считать.
    Ответ написан
    Комментировать
  • Как использовать тип данных даты в django в postgresql?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Проблема в том, что у вас в таблице уже существует поле с именем EventDate и оно ни разу не date.
    Обратите внимание, что ваша миграция пытается сделать ALTER COLUMN со сменой типа.
    Ответ написан
    Комментировать
  • Почему выводит 2 одинаковые записи?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Потому что это соответствует вашим данным?

    Если непонятно - смоделируйте элементарный nested loop на пальцах, выполняя чтения из ваших таблиц по одной.
    Ответ написан
    Комментировать
  • Конвертация текстовых записей таблицы в json?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    update tablename set jsoncol = cast(cast(data as json)#>>'{}' as json);
    Ответ написан
  • Можно ли делать image resize в lxc (proxmox ve) без остановки PostgreSQL?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Можно ли делать resize диска без остановки работы СУБД

    Да.
    postgresql использует рядовые sysctl работы с файлами и не взаимодействует с устройством напрямую.
    Ответ написан
    1 комментарий
  • Создание таблицы с сортировкой?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Невозможно.
    В postgresql из коробки есть только heap - несортированная куча.

    Обратите внимание, что в SQL вообще не существует сортировки кроме той, которую вы явно запросили в запросе, указав ORDER BY.
    Ответ написан
    Комментировать
  • Возможно сохранить копию запроса с определенной таблицы?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    плюс надо рестартить базу чтобы они заработали

    С чего вы так решили?

    В момент выполенния запроса от текста запроса уже ничего не остается, он распаршен.

    Да щас. Заботливо хранится, т.к. может потребоваться для того же логирования.

    Выполняющийся в данный момент запрос клиента можно достать откуда угодно (в том числе из триггера) вызовом current_query().
    Конкретную таблицу логировать удобнее да, триггером.
    Ответ написан
    7 комментариев
  • Копировать данные между двумя базами данных?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    FDW, dblink, pg_dump, copy to/copy from, написание отдельного скрипта на любом прикладном языке - что вам проще и какая возможность доступна - так и делается.
    Лишь только не перепутать местами источник и целевую базу.

    Например, на восстановленной базе переименовать табличку, pg_dump -t имя_таблички, импортировать в боевую базу
    Или взять pg_dump -s -t проблемная табличка, \copy в локальный файл данных, \copy из файла в пустую временную табличку
    А имея под рукой рядом оригинальную и восстановленную табличку уже править данные в ней
    Ответ написан
    Комментировать
  • Что лучше использовать для нахождения количества активных соединений с базой?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Без разницы. У них один и тот же источник данных. Можно и напрямую pg_stat_get_db_numbackends(oid) вызвать.

    В production для мониторинга обычно используется pg_stat_activity чтобы сразу забрать группировку по статусам backend'ов, длительность активных транзакций. Ну и скорее всего только client backend будут интересны на этом графике (ну возможно ещё с parallel worker'ами). Для процессов autovacuum удобнее отдельный график иметь.
    Ответ написан
    Комментировать
  • Как отловить плавающий по времени запрос?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    После, с параметрами которые отрабатывали 3-6 секунд, запрос выполняется с нормальной скоростью в ms

    Симптоматика медленного чтения с дисков.
    Поставьте pg_stat_statements, включите track_io_timing и посмотрите в blk_read_time, blk_write_time этого запроса относительно числа вызовов и общего времени их выполнения.

    PS: обратите внимание, что для СУБД критична латентность дисковой системы. Есть графики латентности io на чтение и запись?
    Ответ написан
  • Как происходит разрешение коллизий в хэшах PostgreSQL?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    При записи данных tuple id просто сохраняются как есть в индексе. Неважно, это другая версия строки или неудачно попали на коллизию хеш-функции с другими данными
    При чтении hash индекс сообщает executor'у, что возвращаемые tuple id необходимо перепроверить по реальным данным (проставляет xs_recheck для indexscan либо выбирается bitmap scan с recheck condition) - механизм lossy поиска.
    Ответ написан
    Комментировать