Задать вопрос
Ответы пользователя по тегу PostgreSQL
  • Джобы postgresql - какие есть?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    А в чем проблема? Он говорит, что у каждой джобы есть свой идентификатор. Разные джобы (с разными ID) могут запускаться параллельно, но если этот ID одинаковый, то становятся в очередь и запускаются последовательно.
    Т.е. пункт а выполняется (хотя могут и быть другие уточнения)
    Ответ написан
    4 комментария
  • Как работают явные блокировки в PostgreSQL?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Явные блокировки таблиц, строк объявляются внутри транзакции. Следовательно, они тоже работают со снимком

    Откуда такие умозаключения?

    Для хранения блокировок используется отдельное место в общей памяти - они доступны всех бэкэндам.

    Снимки используются только для определения того, видны ли данные (кортеж) или нет - они локальны для каждого бэкэнда.
    Ответ написан
    Комментировать
  • Как правильно написать запрос на выборку данных в PostgreSQL?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Используй LEFT JOIN с группировкой и having фильтром. Примерно так:

    select m.id, min(s.sent_at) min_sent_time from message m 
          left join sent_log s on m.id = s.message_id
    group by m.id
    having min(s.sent_at) is null or min(s.sent_at) < :time;


    Вместо :time подставь свое значение
    Ответ написан
    Комментировать
  • Возможно ли ускорить выборку?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Не знаю бизнес-логику, но первый и второй запросы должны дать разные результаты - не факт, что у тебя ID будет указывать на точное расположение записи в этой таблице, т.е. LIMIT 100 OFFSET 95500 и WHERE id BETWEEN 95500 AND 95600 - это разные вещи.

    И еще - большая часть ресурсов уходит на то, чтобы вызвать jsonb_array_contents. ProjectSet узел дает больший вес. Скорее всего, это потому что там находится 95600 элементов в массиве.

    Скорее всего, ты хочешь реализовать пагинацию. В PostgreSQL для этого существуют курсоры:

    DECLARE array_elements CURSOR FOR
    select
      jsonb_array_elements(content->'blocks') as content
    from
      data
    where
      "order" = 2 and external_id = 1;


    А потом используешь его:

    FETCH 100 FROM array_elements;

    Но проблему это скорее всего не решит. Здесь лучше хранить эти элементы массива в другой таблице. Например, такой:

    CREATE TABLE array_elements(
       order integer REFERENCES data("order"),
       external_id integer REFERENCES data(external_id),
       element jsonb
    );
    CREATE INDEX array_elements_order_external_id_idx on array_elements(order, external_id);


    Использовать курсор при этом не запрещается.
    Ответ написан
    Комментировать
  • Как использовать оконные функции в Order By?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Потому что сортировка происходит по названиям столбцов.

    Что ты хочешь получить, указывая ORDER BY w, какая логическая операция должна быть произведена? w это не скаляр, который можно сравнить, а внутренняя машинерия.

    Если хочешь по сумме этой отсортировать, то лучше так (добавить alias):

    SELECT sum(num) AS num_sum OVER w FROM my_table WINDOW w AS (PARTITION BY name) ORDER BY num_sum;
    Ответ написан
    Комментировать
  • Важен порядок элементов в параметре типа список в 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. Надо попробовать без него
    Ответ написан
    Комментировать