Ответы пользователя по тегу PostgreSQL
  • Как быстро удалить Foreign Table в postgres?

    Melkij
    @Melkij
    PostgreSQL DBA
    Не могу удалить 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
    PostgreSQL DBA
    Не соответствуют типы данных как они объявлены в выходных параметрах функции и тем, что вы пытаетесь делать в 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
    PostgreSQL DBA
    Вопрос в заголовке и вопрос в описании - два совершенно разных вопроса.

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

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

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

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

    Melkij
    @Melkij
    PostgreSQL DBA
    Описание синтаксиса весьма красноречиво намекает о реализации
    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
    PostgreSQL DBA
    Можно ли сделать так, чтобы запрос выполнялся дольше, но меньше загружал CPU -- может есть какие-то способы понизить приоритетность выполнения?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Melkij
    @Melkij
    PostgreSQL DBA
    hash индекс строится в один поток, для них многопоточный create index не делали. Потому загрузка 100% одного ядра - ситуация нормальная.
    Нет, create index не зависает.
    Если у вас селективность поля хреновая - то hash индекс будет строиться медленно, т.к. много строк попадает в одно и то же значение хеширования. Не помню точно, как именно хранится список TID при коллизиях хеш-функции, но точно работает хреново при большом числе дублей значений.

    Если версия postgresql достаточно свежая - то смотрите pg_stat_progress_create_index системное представление. Там будут некоторый progress reporting.
    Ответ написан
    4 комментария
  • Как корректно запустить базу postgresql после полного удаления каталога wal?

    Melkij
    @Melkij
    PostgreSQL DBA
    Корректно - абсолютно никак. WAL критичная часть базы.

    Некорректно, без всяких гарантий, но на clean shutdown базе можно надеяться без потери данных - pg_resetwal. Перед использованием сделайте бекап всего PGDATA ( /var/lib/postgresql/10/ut/ в вашем случае судя по пути до pg_wal). После старта базы - pg_dumpall и initdb всего кластера заново, как прямым текстом указано в документации к pg_resetwal.

    как нужно было сделать по уму если валы от слота не удаляются при удалении слота.

    Дождаться или сделать руками чекпойнт.
    Ответ написан
    Комментировать
  • Как правильно составить запрос в базу?

    Melkij
    @Melkij
    PostgreSQL DBA
    В принципе не надо так делать фильтр по месяцу через date_trunc.
    Напишите обычный
    and date >= '2021-04-01' and date < '2021-05-01'
    Индекс по btree( user_id, date ) вам наверняка ещё не раз пригодится. А вот городить отдельный btree(user_id, date_trunc('month', date)) под конкретный запрос - зачем, если можно сразу нормально написать сам запрос?

    Если лениво считать в коде первый день следующего месяца - попросите это сделать саму базу date '2021-04-01' + interval '1 month'
    Ответ написан
    Комментировать