Ответы пользователя по тегу PostgreSQL
  • Снижение производительность при использование функции length(text)?

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

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

    create index t_my_str_length_idx on t(length(my_str));
    Ответ написан
    Комментировать
  • Как настроить Vacuum для PostgreSQL через cron в ubuntu?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Для подобных дел autovacuum придумали. Просто проставь нужный autovacuum_naptime в конфигурации

    spoiler
    Какая версия этого postgres? автовакум добавили в 8.1 - это 2005 год
    Ответ написан
  • Как установить pg_dump на Windows?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    При установке значит PATH не был обновлен.
    Надо найти директорию, в которую установлен postgres и попробовать запустить оттуда.
    Возможный путь C:\Program Files\PostgreSQL\%version%\bin:
    - %version% - подставляешь свою версию
    - Все бинари лежат обычно в /bin директории (pg_ctl, pg_dump, initdb и др.)

    После рекомендую обновить PATH - добавить этот путь.

    Дополнительно: в настройках pgAdmin можно прописать кастомный путь до постгреса:
    File (правый верхний угол) -> Preferences -> Paths -> Binary paths
    Возможно после этого и pgAdmin заработает
    Ответ написан
    1 комментарий
  • Как исправить запрос без агрегатной функции в Where?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Условие задачи понял так: надо найти индексы записей, которые образуют окно в котором b04 равны тем, что указаны в массиве.
    Записи могут идти в любом порядке, поэтому предположил (из примера), что они должны сравниваться в порядке indx
    with window_table as (
            select array_agg(indx) over prev_rows as indexes, 
                       array_agg(b04)  over prev_rows as vals 
            from tb 
            window prev_rows as (order by indx rows between 2 preceding and current row)
    ) 
    select unnest(indexes) 
    from window_table 
    where vals = ARRAY[60, 119, 58];
    Ответ написан
  • Нужен ли первичный ключ в таблицах PostgreSQL?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Почему работает в Access - потому что это другая БД. Поведение может различаться.

    Что касается обязательности ключевого поля - странно. Таблицу можно создать и без него.

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

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Значит есть открытая сессия с этой БД. Закрой ее (например, pg_terminate_backend()) и повтори заново
    Ответ написан
    Комментировать
  • Как правильно восстановить бэкап созданный с помощью pg_dumpall?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Судя по всему эта бд/таблицы уже существуют.
    Тут 2 варианта:
    - Удаляешь БД вручную и запускаешь заново
    - Делаешь новый бэкап, но добавляешь флаг --clean (чтобы DROP DATABASE выражение тоже было, т.е. пересоздать) - pg_dumpall --clean > db.out
    Ответ написан
    5 комментариев
  • Чем можно проанализировать дедлоки?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Можно использовать системный каталог - pg_stat_activity в помощь.

    Вот так, можно показать приложения (скорее сессии) и их запросы, которые заблокированы в транзакции:

    select application_name
    	, client_addr
    	, state
    	, query
    from pg_stat_activity
    where wait_event_type = 'Lock' and wait_event = 'transactionid';


    Но строка запроса тут plain text (с подставленными значениями). Если есть расширение pg_stat_statements, то можно использовать query_id, чтобы нормализовать ее

    select a.application_name
    	, a.client_addr
    	, a.state
    	, s.query
    from pg_stat_activity a
    	join pg_stat_statements s on a.query_id = s.queryid
    where wait_event_type = 'Lock' and wait_event = 'transactionid';


    Дальше все просто - находишь кто эти запросы посылает (если сервисов несколько) и по строке определяешь в каком месте затык/дедлок

    P.S. также есть pg_locks, но он больше про блокировки объектов БД
    Ответ написан
    Комментировать
  • С какого количества записей индексация имеет смысл?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Делать индексацию ради индексации - плохая затея.
    На малом количестве записей она либо заметна не будет, либо планировщик просто не будет его (индекс) использовать.
    Когда и на что делать индексы лучше определять:
    - Это основной юз. кейс приложения - например поиск нужного документа по номеру ФЗ
    - Объемное тестирование показало большую деградацию производительности

    Также меня интересует само индексированное поле. Если это просто имя пользователя (Иван, Алексей, Елена), то:
    1. Индекс лучше не строить, т.к. селективность будет большой и индекс будет редко использоваться
    2. Создать индекс на нормализованное имя - CREATE INDEX name_idx ON users (lower(name));

    Но если это username/login (т.е. неизменяемый логин пользователя), то в принципе нормально.
    Ответ написан
    Комментировать
  • Почему не работает условие по уникальному индексу?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Попробуй переиндексировать таблицу: REINDEX TABLE cart;
    Также, возможно уже есть такая запись с NULL
    Ответ написан
    Комментировать
  • Как заменить слова в колонке по точному совпадению?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    UDPATE posts SET theme = 'IT' WHERE theme = 'it'
    Ответ написан
    2 комментария
  • Можно ли всем строковым полям задавать тип TEXT и повлияет ли это сильно на производительность?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Судя по этой статье можно всегда использовать TEXT вместо CHAR(N) и VARCHAR(N), т.к. производительность особо не страдает.

    А если самому пойти в документацию, то можно увидеть следующее:
    There is no performance difference among these three types, apart from increased storage space when using the blank-padded type, and a few extra CPU cycles to check the length when storing into a length-constrained column. While character(n) has performance advantages in some other database systems, there is no such advantage in PostgreSQL; in fact character(n) is usually the slowest of the three because of its additional storage costs. In most situations text or character varying should be used instead.

    Т.е. в производительности разницы нет - только в стоимости хранения. (в отличие от других СУБД)
    Ответ написан
    5 комментариев
  • Какой хост внутри контейнера?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Попробуй указать имя хоста контейнера напрямую через hostname

    db:
        ports:
          - 5432:5432
        hostname: 'db'
        restart: always
        build:
          context: docker
          dockerfile: db.Dockerfile
        env_file:
          - configuration/db.env
        volumes:
          - .:/docker-entrypoint-initdb.d
          - ./dump:/var/www/dump
          - dbdata:/var/lib/postgresql/data
    Ответ написан
    Комментировать
  • Как сгруппировать запрос по колонке с булевым значением?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    SELECT * FROM todos GROUP BY user_id, completed;
    Ответ написан
  • Из-за чего ошибка syntax error at or near "$1"?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Потому что нельзя передавать название таблицы в качестве параметра - Оно должно быть указано явно и прямо, а параметризация нужна для ПАРАМЕТРОВ.

    Либо переделывай, либо вот тут вроде есть решение
    Ответ написан
    3 комментария
  • Из-за чего докер контейнер выдает ошибку и как его остановить Resource is still in use?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    тебе просто нужно удалить контейнер, которому примаунчен этот вольюм.
    пока контейнер ОСТАНОВЛЕН все ресурсы за ним еще сохраняются
    Ответ написан
    1 комментарий
  • Как работают транзакции, уровни изоляции в данном случае?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    1) Что будет с запросом UPDATE, если исполнение кода ещё не дошло до этого запроса, оно получается будет ещё доступна для запросов из другого кода?

    Не понял, что имеется ввиду. Но если это про то - "будут ли видны изменения, которые сделаны до вызова этого UPDATE в транзакции", то это зависит от уровня изоляции других транзакций.
    В случае SERIALIZABLE - нет, не увидят.
    2) А если функцию sameFunc запустят много юзеров? Получается КАЖДЫЙ юзер будет ждать завершения предыдущих транзакций от всех остальных юзеров?

    Так как указана SERIALIZABLE, то да:
    - Если конфликтов не будет, т.е. никто не обновлял те же самые записи, то будут ждать
    - Если кто-то одновременно обновил одни и те же данные, то будет конфликт транзакции

    Стоит еще учесть, что если одна и та же запись обновлена одновременно разными транзакциями, то поздняя транзакция просто заблокируется и будет ждать: либо когда первая закоммит - тогда конфликт транзакции, либо первая выполнит откат и ты продолжишь выполнение
    P.S. еще есть таймаут ожидания транзакции

    3) А если все запросы в транзакции взаимодействуют только с полями конкретного юзера, то как это нужно реализовать в транзакциях? Вроде как объект транзакции один — сам node.js, который единожды подключается к БД.

    А вот тут надо разобраться. Зависит от того как ты работаешь с БД.
    Судя по названию ты используешь пул соединений (переменная pool) и каждый раз выполняешь запрос на нем. Я не знаю node.js и фреймворк для БД, который ты используешь, но что-то подсказывает, что на каждый такой .query создается отдельное подключение и выполняется запрос.
    Если да, то этот код работать не будет, т.к. ты постоянно открываешь новое соединение, начинаешь транзакцию или запрос и закрываешь соединение. В этом случае, все начавшиеся транзакции завершатся сразу, а запросы, которые должны работать в транзакции будут выполняться сразу.
    Чтобы все работало корректно - на каждом вызове этого метода открывай новое соединение и работай с ним. Тогда гонки в коде не будет. (Можно еще использовать пул соединений).

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

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Единственный вариант кроме рекурсии - хранимая процедура.
    Ответ написан
  • Как исправить ошибку при сборке докера:: database "db" does not exist?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Потому что базы данных db не существует. По умолчанию создается бд postgres.
    Тут 3 решения:
    - Создать БД db при старте приложения
    - Использовать скрипт инициализации - все *.sql файлы внутри директории /docker-entrypoint-initdb.d/ выполняются при инициализации БД
    - Указывать название БД по умолчанию через переменную окружения POSTGRES_DB: 'db'
    Ответ написан
  • Как поменять значения во всех таблицах postgresql?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Нашел ответ тут - https://fraserclark.net/2023-10-06-rds-oids/
    Вот скрипт, который он предложил:
    #!/bin/bash
    
    # I found without setting this the script would fail
    export PGPASSWORD=xxxx
    
    # Define your query
    QUERY="SELECT current_database(),n.nspname ,c.relname, c.relkind from pg_class c, pg_attribute a, pg_namespace n where c.oid = a.attrelid and a.attname = 'oid' AND c.relnamespace = n.oid AND n.nspname NOT IN ('pg_catalog', 'information_schema') and c.relkind = 'r';"
    
    # Get a list of all databases in the RDS cluster
    DATABASES=$(psql -h hostname.eu-west-2.rds.amazonaws.com -p 5432 -U postgres -c "SELECT datname FROM pg_database WHERE datname NOT IN ('template0', 'template1');" -t)
    
    # Loop through each database and execute the query
    for DB in $DATABASES; do
        echo "Running query on database: $DB"
        psql -h qa-hostname.eu-west-2.rds.amazonaws.com -t -c "$QUERY" -U postgres -d $DB
    done
    Ответ написан