Найти в Дзене
Crazy Coder

PostgreSQL - логи, индексы, блокировки

Логи В PostgreSQL, логи (журналы) — это файлы, которые содержат информацию о действиях базы данных, таких как ошибки, информационные сообщения, предупреждения, и выполненные SQL-запросы в зависимости от настроек логирования. Для настройки логирования используются параметры в файле postgresql.conf, например: Чтобы изменения вступили в силу, может потребоваться перезагрузка сервера PostgreSQL. pgBadger — это анализатор журналов https://postgrespro.ru/docs/postgrespro/16/app-pgbadger pg_stat - хранится статистика, по которой планировщик решает как быть (distinct - уникальность, correlation - упорядоченность, null_frac - сколько null, most_common_vals и most_common_freqs - что чаще всего встречается) https://postgrespro.ru/docs/postgresql/16/view-pg-stats Модуль pg_stat_statements предоставляет средства для отслеживания статистики планирования и выполнения всех операторов SQL, выполняемых сервером https://postgrespro.ru/docs/postgresql/16/pgstatstatements Блокировки структур данных в RAM Б
Оглавление

Логи

В PostgreSQL, логи (журналы) — это файлы, которые содержат информацию о действиях базы данных, таких как ошибки, информационные сообщения, предупреждения, и выполненные SQL-запросы в зависимости от настроек логирования.

Для настройки логирования используются параметры в файле postgresql.conf, например:

  • log_destination: определяет, куда отправлять лог (например, stderr, csvlog, или syslog).
  • logging_collector: включает или отключает сбор логов (если включен, логи будут записываться в файлы в каталоге, указанном в log_directory).
  • log_directory: указывает каталог для файлов журнала.
  • log_filename: определяет шаблон имени файла лога.
  • log_statement: определяет, какие SQL-запросы логировать (например, none, mod, ddl, all).
  • log_min_duration_statement: минимальная продолжительность выполнения запроса в миллисекундах, которая будет залогирована.
  • log_error_verbosity: уровень подробности логирования ошибок (например, default, verbose, terse).

Чтобы изменения вступили в силу, может потребоваться перезагрузка сервера PostgreSQL.

pgBadger — это анализатор журналов https://postgrespro.ru/docs/postgrespro/16/app-pgbadger

pg_stat - хранится статистика, по которой планировщик решает как быть (distinct - уникальность, correlation - упорядоченность, null_frac - сколько null, most_common_vals и most_common_freqs - что чаще всего встречается) https://postgrespro.ru/docs/postgresql/16/view-pg-stats

Модуль pg_stat_statements предоставляет средства для отслеживания статистики планирования и выполнения всех операторов SQL, выполняемых сервером https://postgrespro.ru/docs/postgresql/16/pgstatstatements

Блокировки структур данных в RAM

Блокировки бывают монопольные (менять) и разделяемые (читать).

Блокировки устроены в основном на счётчиках.

Блокировка на расширение страниц.

Блокировки можно посмотреть в pg_stat_activity — это системное представление, позволяющее идентифицировать активные SQL-запросы в экземплярах AnalyticDB для PostgreSQL. Представление pg_stat_activity показывает серверный процесс, связанный с ним сеанс и запрос в каждой строке. https://postgrespro.ru/docs/postgresql/16/monitoring-stats#MONITORING-PG-STAT-ACTIVITY-VIEW

PostgreSQL : Документация: 16: 13.3. Явные блокировки

pg_locks - показывает тяжёлые блокировки (блокировка расширения файла, когда добавляем что-то в индекс).

select pid
from pg_locks l
join pg_class t on l.relation = t.oid
where t.relkind = 'r'
and t.relname = 'search_hit'; -- смотрим pid блокировок

select pid, state, usename, query, query_start
from pg_stat_activity
where pid in (
select pid from pg_locks l
join pg_class t on l.relation = t.oid
and t.relkind = 'r'
where t.relname = 'search_hit'
); -- запросы, которые вызвали блокировки

SELECT pg_cancel_backend(12345); -- удаляем блокировку для pid 12345
SELECT pg_terminate_backend(12345); -- force delete блокировки
для pid 12345

Можно установить lock_timeout - и не повесить систему блокировками, если есть долгие запросы на чтение.

SET lock_timeout TO '2s'

CREATE INDEX CONCURRENTLY items_value_idx ON items USING GIN (value jsonb_path_ops); -- ленивое создание индекса, блокирует только другие DDL

Блокировки строк

PostgreSQL - ставить блокировки внутри страницы данных, а не в ОЗУ.

Блокировки строк хранятся в системном поле xmax. Поле xmin хранит номер транзакции, которая создала данную строку, а xmax — номер транзакции, которая ее удалила.

Есть проблема очередей блокировок, если предыдущие локи меняют строку, то следующие могут отвалиться.

Индексы в PostgreSQL

B-tree - сбалансированное дерево с фиксированным числом уровней, оптимизирован для однозначных и диапазонных запросов.

GIN - Хранит список всех уникальных слов (лексем) и указывает, в каких документах они встречаются, оптимизирован для поиска по текстам, массивам и другим составным типам данных. Поддерживает быстрый поиск по нескольким ключам. Подходит для json
(Медленнее при вставке/обновлении).

Полнотекстовый поиск в PostgreSQL работает следующим образом:

Токенизация: Текст разбивается на слова или токены.
Нормализация: Токены приводятся к нормальной форме, например, с помощью стемминга.
Создание лексем: Нормализованные токены преобразуются в лексемы, которые являются базовыми единицами поиска.
Индексация: Лексемы индексируются с использованием GIN, что позволяет быстро находить документы, содержащие заданные слова.
Поиск: При выполнении полнотекстового поиска запрос также преобразуется в лексемы, и с помощью индекса быстро находятся соответствующие документы.

CREATE INDEX idx_documents_body ON documents USING GIN (to_tsvector('english', body));

GiST - Использует n-арное дерево, может использоваться для геометрических, текстовых и других сложных типов данных (Вставка/обновление медленнее, чем в B-tree)

BRIN (Block Range INdex) — это тип индекса в PostgreSQL, предназначенный для эффективной работы с очень большими таблицами, в которых данные физически упорядочены по значению индексируемого столбца. BRIN индексы идеально подходят для столбцов с естественным порядком, например, временные ряды или последовательные идентификаторы. BRIN индекс хранит сводную информацию о диапазонах блоков (например, минимальное и максимальное значения) в таблице, а не о каждой отдельной строке.

Если больше 20% нагрузки это запись - то стоит рассмотреть noSQL

ObjectId это словарь с типами PostgreSQL и примитивами языка, в которых в которые нужно маршалить этот тип данных