Ответы пользователя по тегу PostgreSQL
  • Важен порядок элементов в параметре типа список в SELECT чтобы избежать дедлока?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Да, в этом случае может быть дедлок. Общая рекомендация - сортировать такие списки переменных (еще и = ANY или in values).
    Ответ написан
    2 комментария
  • Как сделать одну базу данных из другой по шаблону?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Тебе надо сдампить БД из mysql в postgresql. Поиск ответа решается простым гуглением "migrate from mysql to postgresql"

    Как варианты pgloader (предпочтительнее) или liquibase
    Ответ написан
    Комментировать
  • Можно ли перенести файл с партицией из таблицы в одной БД Postgresql в другую БД?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Нельзя это сделать.
    Причин много:
    1. Все данные хранятся не в 1 файле, а в нескольких
    2. В файлах хранятся не вот уже готовые данные, а множество различных кортежей - для MVCC. А без понимания ID транзакции (которая в другой БД будет иной) они бессмысленны. То есть, переложив физически файлы ты получишь белеберду
    3. В Postgres нет возможности приаттачить файлы. Есть возможность INSERT/COPY, сдампить, но файлы напрямую нельзя. (нет такой опции в Attach)
    4. В файле хранятся не сериализованные в независимом формате данные, а (грубо говоря) структуры C. Как они располагаются зависит от endianess, компилятора и т.д.
    5. Даже если ты это все сделаешь, то не факт, что различные OID сойдутся - т.е. таблица будет хранить OID, которого в другой БД не существует

    Если хочешь ускорить процесс, но используй pg_dump с ключом -fd (специальный формат), а в pg_restore -j NJOBS - распараллеливание (NJOBS - кол-во воркеров).
    Ответ написан
    Комментировать
  • Какой алгоритм поиска по базе более быстрый и менее затратный по ресурсам для выполнения?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Попробуй GIST индекс
    Ответ написан
    Комментировать
  • CREATE USER не учитывает регистр?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Если кавычек нет, то предполагается, что без учета регистра. Грубо говоря, без кавычек - все в нижний регистр.
    В данном случае, надо добавить кавычки вокруг имени пользователя:
    CREATE USER "PolzaK" WITH PASSWORD

    Но учитывай, что тебе и дальше придется всегда указывать кавычки. В противном случае,
    ALTER USER PolzaK ...
    Тоже самое, что и
    ALTER USER polzak ...
    Ответ написан
    Комментировать
  • Как выбрать записи из таблицы с макимальным значением за каждый день в PostgreSQL?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    SELECT distinct 
          LAST_VALUE(id) OVER (PARTITION BY created_at::date ORDER BY value DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) id, 
          LAST_VALUE(value) OVER (PARTITION BY created_at::date ORDER BY value DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) value, 
          LAST_VALUE(created_at) OVER (PARTITION BY created_at::date ORDER BY value DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) created_at 
    FROM tbl 
    ORDER BY created_at;
    Ответ написан
    Комментировать
  • Как находить медленные запросы PostgreSQL?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    у постгреса нет встроенного веб-дашборда.
    зато есть куча таблиц и расширений, откуда такую информацию можно получить.

    для какой-нибудь UI панельки можно попробовать сочетание: postgres + pg_stat_statement + prometheus.
    Первые 2 (вместе с расширением) - получаешь чиселки запросов
    Последнее - эти чиселки читаешь и визуализируешь

    Запросов можно составить огромное количество - на каждый возможный случай.
    Вот тут глава 3 - находи свой случай и используй на здоровье
    Ответ написан
  • Как организовать фильтрацию в БД по сложным фильтрам?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    В таких ситуациях надо делать так:

    - Реализуем систему генерации нужного запроса с фильтрами
    - На БД делаем возможность отслеживать запросы (время выполнения, частота использования и т.д.)
    - Запускаем пользователей
    - Собираем статистику по запросам
    - Выявляем какие фильтры используются чаще всего
    - Делаем индексы для этих выражений

    Замечания:
    - В postgres отслеживать запросы можно расширением pg_stat_statement. А вообще рекомендую главу 3 Мониторинг PostgreSQL
    - Я сказал "индексы для выражений", т.к. скорее всего у тебя будут не простые поля, а именно выражения - Postgres позволяет по ним делать индекс
    - Сколько времени собирать статистику - решай сам. например, как только все запросы начнут деградировать (не рекомендую до такого доводить)
    Ответ написан
  • Как задать пароль пользователю postgres, если авторизация по ssh-ключу?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    А зачем выполнять от sudo? Если надо указать пользователя postgres, то это можно сделать ключом -U postgres.

    psql -U postgres template1
    Ответ написан
    5 комментариев
  • Как убрать ввод пароля в psql в shell скрипте?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Как уже сказали: .pgpass (предпочтительный) или через флаг -W

    Также можно задать переменную окружения PGPASSWORD (но также не безопасно, т.к. виден в ps)

    PGPASSWORD=password psql -h 192.168.20.145 -p 5432 -U tony -d trn -с "Some magic things"


    P.S. если это в скрипте, то лучше будет самому скрипту передать переменную

    PGPASSWORD=password ./connect-psql.sh
    Ответ написан
    5 комментариев
  • Neon Postgresql почему в таблицу не добавляется?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Посмотрел на этот issue - https://githubissues.com/drizzle-team/drizzle-orm/1592
    Проверь, генерится ли схема в файле
    Ответ написан
  • Как верно написать рекурсивный запрос sql?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    То что ты хочешь - это excel-специфично, его формат отображения. Такого ты не получишь.
    Есть несколько вариантов как это можно сделать в один столбец.

    1. В единственной строке отображай все ID

    select e.manager_id::text || ' - ' || array_agg(id)::text
    from employees as e
    where e.manager_id is not null
    group by e.manager_id
    order by e.manager_id;


    2. Добавляй паддинг для каждой строки (пустые строки)
    with manager_groups as (
    	select manager_id::text, array_agg('          ' || id::text) as ids
    	from employees as e
    	where e.manager_id is not null
    	group by e.manager_id
    	order by e.manager_id
    )
    select 
    	x.id
    from (
    	select unnest(array_prepend(manager_id, ids)) as id
    	from manager_groups
    ) as x;
    Ответ написан
    Комментировать
  • Как работают дедлоки?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Этот дедлок - проявление MVCC, механизма, чтобы несколько пользователей могли работать с БД одновременно.
    Визуализировать эту ситуацию можно как перекрестные стрелки в зависимостях
    667ef3df77793070431787.png

    Если мы говорим про postgres, то если ты обновил какую-то запись (кортеж), то неявно получаешь на нее (запись) блокировку. Когда кто-то другой хочет обновить эту же запись, то ждет ее освобождения.
    В данном случае (визуализация), 1 процесс выполнял UPDATE X, Y а другой UPDATE Y, X, т.е. первый взял блокировку сначала на X потом на Y, а другой - сначала на Y потом на X. Первая блокировка успешна, но вторые нет - они уже заняты.
    В данном случае, разрешить их нельзя, т.к. оба ждут пока один из них снимет блокировку, но этого не произойдет. Блокировка со строки снимется по окончании транзакции.

    Совет про сортировку взят, чтобы привнести единообразие в работу. Грубо говоря, дедлок появляется, когда нет согласованности в работе. Если оба выполнят UPDATE X, Y (в таком порядке), то дедлока не будет т.к. один из них сможет взять все блокировки на строки успешно. Поведение второго будет уже зависеть от уровня сериализации:
    - Read committed - обновит новые данные
    - Другие (repeatable read, serializable) - ошибка выполнения
    Это уже детали MVCC в postgres (read uncommitted нет)
    Ответ написан
    3 комментария
  • Почему при восстановлении резервной копии PostgreSQL возникают ошибки, хотя база работает корректно?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    pg_restore пытается дропнуть таблицы, которых нет. Скорее всего, вызывается с ключом -c/--clean. Надо попробовать без него
    Ответ написан
    Комментировать
  • Почему не получается подрубиться к удаленному PostgreSQL из DBeaver?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Скорее всего это файрвол.
    Учитывая, что не на локальном ПК это все дело работает, то вполне возможно что сетевики настроили правила и трафик не проходит. При этом сервак сам может определяться и пинговаться.
    Ответ написан
    Комментировать
  • Можно ли гарантировать надежность снапшота?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Если мы говорим про утилиты постгреса для бэкапа, то они будут согласованными, т.к. влияют на работу сервера. Например, заставляют все страницы сброситься, выполнить чек-поинт и т.д.
    Например, pg_basebackup:

    pg_basebackup is used to take a base backup of a running PostgreSQL database cluster


    Но если речь идет об утилитах, работающих с фс напрямую (dd, cp и т.д.), то нет - гарантировать ничего нельзя. Как уже было сказано, некоторые буферы могут быть не сброшены, записана только часть страницы и т.д.
    Ответ написан
  • Как переключаться между разными версиями Postgres?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    На Debian-based дистрибутивах (Ubuntu, Debian, etc) есть утилита pg_ctlcluster - с помощью нее можно управлять несколькими инсталляциями postgres одновременно, учитывая версии/название кластера.
    Например, так можно
    # Запуск кластера 15 версии
    pg_ctlcluster start 15 main


    Для того, чтобы они запускались одновременно, то можно использовать разные порты - чтобы запускались на разных портах. Например, 15 версия на 5432 порту, а 13 - на 5433.
    Это сделать можно либо через postgresql.conf - конфигфайл, ищи port. Изначально он такой:
    #port = 5342                      # (change requires restart)


    раскоментируй и выстави свое значение. Подсказка - он скорее всего в директории /var/lib/postgresql//, например, /var/lib/postgresql/13/main/postgresql.conf

    Для подключения просто передай psql нужный порт:
    psql -p 5432 # 15 версия
    psql -p 5433 # 13 версия
    Ответ написан
    2 комментария
  • Как перенести из sqlite3 в Postgresql?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Экспортируй данные из sqlite в формате CSV, и импортируй в postgresql.
    Но перед этим в postgresql надо создать схему вручную - инструментов для миграции не знаю (разве что liquibase, но это уже оверхед на мой взгляд)
    Ответ написан
    1 комментарий
  • Снижение производительность при использование функции length(text)?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    У тебя есть индекс на выражение?
    Если нет, то логично что он делает фул скан таблицы.

    Попробуй этот навесить

    create index t_my_str_length_idx on t(length(my_str));
    Ответ написан
    Комментировать