Совет по логированию в Postgres для повышения производительности: включите логирование временных файлов (log_temp_files).
Зачем?
Идеально — установить
Если лимит превышен — происходит сброс на диск (spill), и создаётся временный файл не меньше, чем
Пример настройки: логировать временные файлы больше 4 МБ (в килобайтах), соответствует текущему значению work_mem:
Пример лога временного файла:
То есть операция сортировки превысила work_mem, и была выгружена во временный файл.🥰
👉 @SQLPortal
Зачем?
Идеально — установить
log_temp_files
в значение, равное текущему work_mem
.work_mem
— это лимит оперативной памяти на одну операцию. Если операция укладывается в этот лимит, временные файлы не создаются и логирование не требуется.Если лимит превышен — происходит сброс на диск (spill), и создаётся временный файл не меньше, чем
work_mem
.Пример настройки: логировать временные файлы больше 4 МБ (в килобайтах), соответствует текущему значению work_mem:
log_temp_files = '4096'
Пример лога временного файла:
2024-05-16 14:23:05.123 UTC [12345] user@database LOG: temporary file: path "base/pgsql_tmp/pgsql_tmp1234.0", size 245760
2024-05-16 14:23:05.123 UTC [12345] user@database DETAIL: Sort operation used temporary file because work_mem was exceeded
То есть операция сортировки превысила work_mem, и была выгружена во временный файл.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍1
Постройте надёжную основу для звёздных схем (star schemas) в Oracle Database, следуя этим рекомендациям от Дани Шнайдера:
Измерения (Dimension)
> Первичный ключ на суррогатном ключе
> Уникальное ограничение на колонке(ах) бизнес-ключа
Факты (Facts)
> Внешний ключ и битмаповый индекс на каждой колонке измерения
📖 Читать: ссылка
👉 @SQLPortal | #cтатья
Измерения (Dimension)
> Первичный ключ на суррогатном ключе
> Уникальное ограничение на колонке(ах) бизнес-ключа
Факты (Facts)
> Внешний ключ и битмаповый индекс на каждой колонке измерения
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Когда следует сбрасывать статистику в Postgres?
Модуль
Чтобы сбросить статистику вручную, выполните:
1) Сразу после значительных изменений в запросах
Если вы внесли серьёзные изменения в код приложения, оптимизировали SQL-запросы или изменили индексы, сброс
2) При проведении тестов производительности
Если вы запускаете бенчмарки или тесты производительности запросов, сброс
3) После крупных операций по обслуживанию
После операций вроде
@SQLPortal
Модуль
pg_stat_statements
в Postgres собирает статистику в течение длительного времени. Эти данные могут устаревать, и если вы полагаетесь на них для оптимизации запросов, сброс статистики поможет быстрее получить актуальную информацию.Чтобы сбросить статистику вручную, выполните:
SELECT pg_stat_statements_reset();
1) Сразу после значительных изменений в запросах
Если вы внесли серьёзные изменения в код приложения, оптимизировали SQL-запросы или изменили индексы, сброс
pg_stat_statements
поможет точнее измерить эффект этих изменений.2) При проведении тестов производительности
Если вы запускаете бенчмарки или тесты производительности запросов, сброс
pg_stat_statements
гарантирует, что результаты будут отражать только те запросы, которые выполнялись в рамках теста.3) После крупных операций по обслуживанию
После операций вроде
pg_repack
, переиндексации или изменения структуры таблиц стоит сбросить pg_stat_statements
, чтобы оценить, как эти изменения повлияли на производительность.@SQLPortal
❤2👍2
Как исполняется SQL-запрос в базе данных?
Разберём на примере:
1. Transport Subsystem
Запрос прилетает по сети и попадает в транспортный уровень базы.
2. Query Processor
SQL парсится → строится Query Parse Tree — дерево, где разбираются:
> SELECT → какие колонки
> FROM → из какой таблицы
> WHERE → какое условие
3. Execution Engine
На основе дерева создаётся Execution Plan:
> индексный поиск по city_index
> выборка колонок name, age
> возврат подходящих строк
4. Storage Engine
Работает с физическими данными через:
> Transaction Manager
> Lock Manager
> Buffer Manager
> Recovery Manager
Это вся цепочка — от строки запроса до результата в твоей IDE.📝
👉 @SQLPortal
Разберём на примере:
SELECT name, age FROM users WHERE city = 'San Francisco'
1. Transport Subsystem
Запрос прилетает по сети и попадает в транспортный уровень базы.
2. Query Processor
SQL парсится → строится Query Parse Tree — дерево, где разбираются:
> SELECT → какие колонки
> FROM → из какой таблицы
> WHERE → какое условие
3. Execution Engine
На основе дерева создаётся Execution Plan:
> индексный поиск по city_index
> выборка колонок name, age
> возврат подходящих строк
4. Storage Engine
Работает с физическими данными через:
> Transaction Manager
> Lock Manager
> Buffer Manager
> Recovery Manager
Это вся цепочка — от строки запроса до результата в твоей IDE.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤6
Общие рекомендации по распределению памяти в Postgres:
🔸 25% — на
🔸 25% — на
🔸 50% — резерв для файлового кэша ОС, системных процессов и служебных операций (например, VACUUM), использующих
👉 @SQLPortal
shared_buffers
(кэш буферов). Чаще всего запрашиваемые данные должны помещаться в кэш. Проверьте коэффициент попаданий в кэш (cache hit ratio) — 98–99% запросов должны обслуживаться из кэша (хотя это зависит от нагрузки).work_mem
, распределённый между соединениями. Значение work_mem
, умноженное на max_connections, должно составлять примерно 25% от общего объёма памяти.maintenance_work_mem
Please open Telegram to view this post
VIEW IN TELEGRAM
👀4🔥3❤2
Используйте иерархический профилировщик (hierarchical profiler) для поиска узких мест в коде PL/SQL. Это позволит вам детально анализировать производительность и находить функции или блоки, которые вызывают наибольшие задержки.
Пример использования:
Начиная с версии Oracle 18c иерархический профилировщик был улучшен и теперь позволяет хранить данные трассировки в таблицах, упрощая последующий анализ и оптимизацию.☺️
👉 @SQLPortal
Пример использования:
DECLARE
-- создание таблиц для хранения данных профилирования
DBMS_HPROF.CREATE_TABLES();
-- запуск профилирования и получение идентификатора сессии профилирования
id NUMBER := DBMS_HPROF.START_PROFILING;
-- ваш PL/SQL код, который нужно профилировать
<code>
-- завершение профилирования
DBMS_HPROF.STOP_PROFILING;
-- анализ данных профилирования с выводом отчета в формате HTML
DBMS_HPROF.ANALYZE(id, report_clob => html);
END;
Начиная с версии Oracle 18c иерархический профилировщик был улучшен и теперь позволяет хранить данные трассировки в таблицах, упрощая последующий анализ и оптимизацию.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
Таймауты запросов находятся в самом верху нашего списка рекомендаций для любой базы данных — будь то маленький pet-проект или крупная продакшен-БД. Мы часто говорим об этом, но если вы вдруг пропустили — выставляйте таймаут запроса от одной до двух минут:
Это предотвратит выполнение запросов, которые «убегают» и начинают потреблять ресурсы сверх меры.
Вы можете установить
👉 @SQLPortal
ALTER DATABASE dbname SET statement_timeout = '60s';
Это предотвратит выполнение запросов, которые «убегают» и начинают потреблять ресурсы сверх меры.
Вы можете установить
statement_timeout
на уровне базы данных, пользователя или сессии. Мы рекомендуем установить глобальный таймаут в Postgres, а затем переопределять его для отдельных пользователей или сессий, которым требуется больше времени на выполнение.Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍2
Ограничения (constraints) в базе данных это хорошая практика: они задают правила на уровне данных, обеспечивая корректность, согласованность и надёжность информации в приложении.
Ограничения предотвращают запись некорректных или противоречивых данных в таблицы.
–
–
Ограничения также поддерживают связи между полями.
–
Многие ORM и приложения тоже реализуют валидации, но дублирование проверки на уровне кода и на уровне базы — это хорошая практика.
Есть туториал по работе с constraints, с примерами кода:
👉 https://crunchydata.com/developers/playground/postgres-constraints-tutorial
👉 @SQLPortal
Ограничения предотвращают запись некорректных или противоречивых данных в таблицы.
–
NOT NULL
гарантирует, что обязательные поля не останутся пустыми.–
CHECK
проверяет, что значения соответствуют заданным условиям (например, age > 0).Ограничения также поддерживают связи между полями.
–
FOREIGN KEY
обеспечивает ссылочную целостность между таблицами. Например, нельзя создать заказ для несуществующего клиента.Многие ORM и приложения тоже реализуют валидации, но дублирование проверки на уровне кода и на уровне базы — это хорошая практика.
Есть туториал по работе с constraints, с примерами кода:
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3🔥1
MongoDB MCP Server полностью изменил мой способ взаимодействия с базами данных.
Вместо того чтобы переключаться между 5 AI-инструментами, теперь я просто общаюсь с базой данных напрямую в IDE.
Показать пользователей, зарегистрированных на этой неделе → мгновенный SQL-запрос.
Как это использовать с Claude, VS Code и Windsurf:
1. Claude Desktop для анализа данных
Можно исследовать сложные данные без единого SQL-запроса.
Просто задаешь вопрос на естественном языке — и сразу получаешь инсайты.
Переход между таблицами, выявление паттернов и связь сущностей — всё в рамках одной простой беседы.
2. VS Code + GitHub Copilot
Создание пользователей, назначение прав, управление кластерами — буквально за секунды.
Администрирование Atlas — прямо из VS Code, без переключения вкладок.
Ты сосредоточен на разработке, AI берёт на себя всю операционку.
3. Windsurf AI + встроенный MongoDB MCP Server
Они вышли на новый уровень:
— выбираешь шаблон сервера, подключение происходит в один клик.
— загружаешь схему — и получаешь сгенерированные data-access-слои с полной типобезопасностью.
Настройка MCP-сервера максимально простая:
10 секунд. Никаких конфигураций. AI-агент подключён.
▶️ GitHub репозиторий: https://fnf.dev/4e74Eag
👉 @SQLPortal
Вместо того чтобы переключаться между 5 AI-инструментами, теперь я просто общаюсь с базой данных напрямую в IDE.
Показать пользователей, зарегистрированных на этой неделе → мгновенный SQL-запрос.
Как это использовать с Claude, VS Code и Windsurf:
1. Claude Desktop для анализа данных
Можно исследовать сложные данные без единого SQL-запроса.
Просто задаешь вопрос на естественном языке — и сразу получаешь инсайты.
Переход между таблицами, выявление паттернов и связь сущностей — всё в рамках одной простой беседы.
2. VS Code + GitHub Copilot
Создание пользователей, назначение прав, управление кластерами — буквально за секунды.
Администрирование Atlas — прямо из VS Code, без переключения вкладок.
Ты сосредоточен на разработке, AI берёт на себя всю операционку.
3. Windsurf AI + встроенный MongoDB MCP Server
Они вышли на новый уровень:
— выбираешь шаблон сервера, подключение происходит в один клик.
— загружаешь схему — и получаешь сгенерированные data-access-слои с полной типобезопасностью.
Настройка MCP-сервера максимально простая:
docker run --rm -i mongodb/mongodb-mcp-server:latest
10 секунд. Никаких конфигураций. AI-агент подключён.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍3
Supabase работает над Multigres — решением для шардинга PostgreSQL, которое позволит масштабировать базу данных до петабайтного уровня
👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯5👍2
CREATE STATISTICS
позволяет взять взаимосвязанные данные в ваших таблицах и объяснить Postgres, как именно они связаны.Например, можно создать статистику для связки country и city следующим образом:
CREATE STATISTICS (dependencies) ON country, city FROM facilities;
ANALYZE facilities;
В нашей тестовой базе данных это сделало один запрос с фильтрацией по WHERE city быстрее в 97 раз
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4❤3👍3
Объединение таблиц в схемы
Таблица представляет собой набор строк и столбцов и описывает определённый объект, например список клиентов, товаров или счетов-фактур. Чтобы работать с несколькими связанными объектами, используют группы таблиц, объединённые в логическую схему. Логическая схема — это структура, связывающая таблицы между собой.
Кроме логической, у базы данных есть и физическая схема. Она определяет, как данные и связанные с ними компоненты (например, индексы) размещаются на диске. Когда речь идёт о «схеме базы данных», обычно имеется в виду логическая схема, а не физическая.
Если в одной системе работают несколько проектов, для каждого проекта можно создать свою схему. Таблицы, относящиеся к одному проекту, размещаются в одной схеме, таблицы других проектов — в других. Это помогает избежать путаницы между одноимёнными таблицами.
Чтобы таблицы из одного проекта случайно не использовались в другом, схемам дают имена. Так, таблицы
👉 @SQLPortal
Таблица представляет собой набор строк и столбцов и описывает определённый объект, например список клиентов, товаров или счетов-фактур. Чтобы работать с несколькими связанными объектами, используют группы таблиц, объединённые в логическую схему. Логическая схема — это структура, связывающая таблицы между собой.
Кроме логической, у базы данных есть и физическая схема. Она определяет, как данные и связанные с ними компоненты (например, индексы) размещаются на диске. Когда речь идёт о «схеме базы данных», обычно имеется в виду логическая схема, а не физическая.
Если в одной системе работают несколько проектов, для каждого проекта можно создать свою схему. Таблицы, относящиеся к одному проекту, размещаются в одной схеме, таблицы других проектов — в других. Это помогает избежать путаницы между одноимёнными таблицами.
Чтобы таблицы из одного проекта случайно не использовались в другом, схемам дают имена. Так, таблицы
CUSTOMER
или PRODUCT
могут встречаться в разных проектах. Чтобы отличать их, при обращении к таблице желательно указывать имя схемы, например: SCHEMA_NAME.TABLE_NAME
. Если схема не указана, SQL использует схему по умолчаниюPlease open Telegram to view this post
VIEW IN TELEGRAM
❤4🔥4
Совет по Postgres: установите таймаут блокировки.
Часто бывает полезно задать
Если вы устанавливаете
Дополнительный совет — логировать ожидания блокировок немного ниже порога таймаута. Например, если таймаут установлен на 5 секунд, логируйте ожидания от 4.9 секунд. Это поможет фиксировать запросы, которые отменяются, для последующего анализа.
👉 @SQLPortal
Часто бывает полезно задать
lock_timeout
в Postgres, чтобы блокировки в рамках сессии автоматически освобождались через определённое время. Это помогает улучшить производительность запросов и предотвращает удержание блокировок на неопределённый срок. Параметр можно задать через ALTER SYSTEM
или на уровне отдельной сессии.Если вы устанавливаете
lock_timeout
на уровне системы, убедитесь, что ведётся логирование, и вы можете видеть ошибки отменённых операций. Такие запросы не были выполнены и должны быть повторно запущены в сессии без установленного таймаута блокировки.Дополнительный совет — логировать ожидания блокировок немного ниже порога таймаута. Например, если таймаут установлен на 5 секунд, логируйте ожидания от 4.9 секунд. Это поможет фиксировать запросы, которые отменяются, для последующего анализа.
lock_timeout
часто можно задать при инициализации ORM и легко подключить к соединению вашей сессии в приложении.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👍2
Подсчеты и общие итоги в Postgres с помощью функций ROLLUP и CUBE:
📖 Читать: ссылка
👉 @SQLPortal | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Представление
Для каждой схемы, таблицы и колонки можно увидеть:
> наличие NULL-значений
> n_distinct / кардинальность
→ отрицательные значения — высокая кардинальность
→ положительные значения — низкая кардинальность
> наиболее часто встречающиеся значения
> частоты этих значений
> информацию о гистограмме распределения данных
В представлении
Эти данные полезны для ряда оптимизаций, главное применение — проектирование индексов:
1. Знание кардинальности
Если колонка с низкой кардинальностью — индекс может не помочь, последовательное сканирование может быть быстрее.
Если колонка с высокой кардинальностью и по ней часто выполняются запросы — индекс, скорее всего, будет полезен.
2. Поиск смещенного распределения
Если колонка имеет кардинальность, но распределение сильно смещено — могут быть полезны частичные индексы.
3. Знание частоты NULL-значений
Это может помочь в проектировании запросов и очистке данных.
👉 @SQLPortal
pg_stats
в Postgres — это действительно удобное место для получения информации о распределении данных по таблицам.Для каждой схемы, таблицы и колонки можно увидеть:
> наличие NULL-значений
> n_distinct / кардинальность
→ отрицательные значения — высокая кардинальность
→ положительные значения — низкая кардинальность
> наиболее часто встречающиеся значения
> частоты этих значений
> информацию о гистограмме распределения данных
В представлении
pg_stats
названия колонок указываются как attname (attribute name), поэтому можно легко просматривать статистику по отдельным колонкам таблицы.Эти данные полезны для ряда оптимизаций, главное применение — проектирование индексов:
1. Знание кардинальности
Если колонка с низкой кардинальностью — индекс может не помочь, последовательное сканирование может быть быстрее.
Если колонка с высокой кардинальностью и по ней часто выполняются запросы — индекс, скорее всего, будет полезен.
2. Поиск смещенного распределения
Если колонка имеет кардинальность, но распределение сильно смещено — могут быть полезны частичные индексы.
3. Знание частоты NULL-значений
Это может помочь в проектировании запросов и очистке данных.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Это визуальная шпаргалка по SQL-командам, оформленная в виде рисунков с фруктами и человечками. Она охватывает основные конструкции SQL на примере таблицы
По моему одна из лучших, что есть🐸
👉 @SQLPortal
fruits
По моему одна из лучших, что есть
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥3