Skip to content

Четыре причины раздувания таблиц в PostgreSQL и как с этим бороться

Автор: Shinya Kato, 4 causes of table bloat in PostgreSQL and how to address them


Раздувание таблиц в PostgreSQL — это явление, при котором «мёртвые записи» (dead tuples), образовавшиеся в результате операций UPDATE или DELETE, не собираются процессом VACUUM, что приводит к неоправданному увеличению размеров файлов данных.


Чтобы VACUUM мог освободить мёртвые записи, должна быть гарантия, что эти записи «точно не могут быть использованы какими-либо активными на данный момент транзакциями». Если старые транзакции сохраняются по какой-либо причине, сборка мусора процессом VACUUM останавливается на этой точке.


В этой статье объясняются следующие четыре причины раздувания таблиц: как каждая проявляется, как определить коренную причину и как её устранить.



  1. Длительные транзакции

  2. Незавершённые подготовленные транзакции

  3. Запросы на серверах-репликах с включённым параметром hot_standby_feedback

  4. Задержка логической репликации


Продолжить чтение "Четыре причины раздувания таблиц в PostgreSQL и как с этим бороться"

Нестандартная оптимизация PostgreSQL

Автор: Haki Benita, Unconventional PostgreSQL Optimizations


Когда дело доходит до оптимизации баз данных, разработчики часто хватаются за одни и те же старые инструменты: немного переписать запрос, навесить индекс на столбец, денормализовать, проанализировать, очистить, перестроить кластер и т.д. Традиционные методы эффективны, но иногда творческий подход может принести реальную пользу!


В этой статье я представляю нестандартные методы оптимизации в PostgreSQL.

Продолжить чтение "Нестандартная оптимизация PostgreSQL"

Индексы BRIN в PostgreSQL для специалистов в SQL Server

Автор: Klaus Aschenbrenner, BRIN Indexes in PostgreSQL


Когда специалисты по SQL Server начинают серьёзно работать с PostgreSQL, большая часть обучения кажется комфортной. Таблицы ведут себя ожидаемо, транзакции знакомы, а B-деревья выглядят обнадёживающе похожими на то, что вы использовали годами в SQL Server. Затем вы сталкиваетесь с индексами BRIN.


На первый взгляд они кажутся почти безрассудными: нет указателей на строки, нет точной навигации и явное принятие ложных срабатываний. И всё же на очень больших таблицах индексы BRIN часто обеспечивают прирост производительности, для достижения которого в SQL Server потребовались бы кластерные индексы, секционирование или даже columnstore-индексы. Чтобы понять почему, нужно посмотреть не только на то, что делает BRIN, но и на то, как он работает внутри.

Продолжить чтение "Индексы BRIN в PostgreSQL для специалистов в SQL Server"

Утраченный символ - от EBCDIC до Emoji

Автор: Joe Celko, Getting Out of Character


Молодые программисты выросли с ASCII и Unicode как единственными способами представления символьных данных в компьютере. Но в тёмные века, до того как мы изобрели грязь и вошли в каменный век, были и другие претенденты.

Продолжить чтение "Утраченный символ - от EBCDIC до Emoji"

Массовая вставка T‑SQL или OPENROWSET: импорт CSV, проблемы доступа к файлам и скрипт PowerShell

Пересказ статьи Rick Dobson. T‑SQL BULK INSERT vs OPENROWSET: CSV Imports, File Access Gotchas, and A PowerShell Script


Большинство руководств по массовой вставке SQL и SQL Server openrowset игнорируют проблемы доступа к файлам, которые могут прервать импорт. И оператор bulk insert, и функция openrowset выполняются под аккаунтом службы SQL Server при чтении файла источника. Аккаунт службы SQL Server должен иметь разрешение на чтение файла или папки, где файл находится. Также удобно иметь разрешения на чтение и выполнение, а также вывод содержимого папки. Кроме того, нестандартные места размещения файла источника (например, C:\Users\Public\Downloads) могут не предоставлять доступ на чтение по умолчанию аккаунту службы SQL Server - всегда проверяйте это перед использованием.

Импорт данных из файла источника в таблицу SQL Server является обычной операцией, но она озадачивает многих новичков и порой вызывает трудности даже у опытных разработчиков в сложных сценариях. В этой статье изучается импорт файлов CSV в таблицы SQL Server либо с помощью оператора BULK INSERT, либо функции openrowset в операторе SELECT. Продолжить чтение "Массовая вставка T‑SQL или OPENROWSET: импорт CSV, проблемы доступа к файлам и скрипт PowerShell"
Категории: T-SQL

Новости за 2026-01-10 - 2026-01-16

§ Новая задача от нового автора (Komov S. M.) выставлена на обучающий этап под номером 192 (сложность 2 балла).


§ Популярные темы недели на форуме

Топик		Сообщений	Просмотров
43 (SELECT) 6 8
58 (DML) 4 5
17 (Learn) 3 8
53 (DML) 2 3
36 (Learn) 2 9

Продолжить чтение "Новости за 2026-01-10 - 2026-01-16"

Надежность PostgreSQL: как WAL помогает восстановить данные

Пересказ статьи Duc Ngo. PostgreSQL Durability: How WAL Helps You Recover Data


  • С целью повышения производительности PostgreSQL сначала сохраняет изменения в RAM.

  • RAM ненадежна, поэтому сбой питания может привести к потере данных.

  • Write-Ahead Logging (WAL - упреждающая журнализация) записывает изменения перед записью на диск

  • WAL гарантирует согласованность и надежность.

  • После краха системы, PostgreSQL может восстановить утерянные изменения, используя WAL.

Продолжить чтение "Надежность PostgreSQL: как WAL помогает восстановить данные"

Повышение производительности PostgreSQL: пошаговое руководство по использованию pg_hint_plan

Пересказ статьи Matheus dos Santos. Mastering PostgreSQL Performance: A Step-by-Step Guide to pg_hint_plan


Планировщик запросов PostgreSQL - это сложный инженерный механизм, обычно принимающий блестящие решения относительно того, как выполнять ваши запросы. Однако в сложных сценариях или при необычных распределениях данных вы можете знать лучший способ. Именно в таких ситуациях на помощь приходит pg_hint_plan - мощное расширение, которое позволяет вам руководить, или "советовать", планировщиком для выбора специфичного пути выполнения.

Это руководство проведет вас через весь процесс, начиная с установки pg_hint_plan из источника до использования его, чтобы принудительно выполнить сканирование индекса на большом наборе данных, демонстрируя возможности непосредственного управления производительностью вашего запроса.
Продолжить чтение "Повышение производительности PostgreSQL: пошаговое руководство по использованию pg_hint_plan"

Основы GROUP BY в SQL

Joe Celko, SQL GROUP BY Basics


Предложения GROUP BY и HAVING в SQL существуют с самого начала языка, в своей простейшей форме. Изначальная идея заключалась в том, что вы создаёте рабочую таблицу с помощью предложений SELECT ... FROM ... WHERE, а затем разбиваете этот результирующий набор на группы. Группа определяется как набор строк с одинаковыми значениями для столбцов группировки. Негруппируемые столбцы должны были быть свойствами группы (обычно агрегатными функциями), формулами или вычислениями, выполненными на них, либо константами (что технически также является свойством группы).


Затем каждая группа сводится к одной строке. Важное понятие здесь — исходная таблица больше не существует. Однако если вы достаточно взрослый, чтобы работать с самыми ранними версиями SQL Server, синтаксис Sybase не избавлялся от исходной таблицы. Это приводило к некоторым проблемам. Он предоставлял доступ к исходным данным строк вместе с агрегированными данными.


Исходное предложение HAVING затем применялось к каждой из строк в новой сгруппированной таблице. Это означало, что оно выполнялось после предложения WHERE, которое строило исходную таблицу.


Позже мы добавили оконные функции, расширения для GROUP BY в форме ROLLUP, CUBE и GROUPING SETS. Но с исходными простыми конструкциями GROUP BY – HAVING всё ещё можно сделать довольно много. Их преимущество в том, что они выполняют свою работу за один просмотр таблицы, в то время как более новые конструкции могут требовать временного хранения или нескольких проходов по данным. Исходные версии переносимы и предсказуемы. Спустя все эти десятилетия они теперь хорошо оптимизированы.

Продолжить чтение "Основы GROUP BY в SQL"

Новости за 2026-01-03 - 2026-01-09

§ Популярные темы недели на форуме

Топик		Сообщений	Просмотров
40 (SELECT) 6 8
149 (SELECT) 5 4
189 (SELECT) 3 3

§ Авторы недели на форуме

Автор		Сообщений
pegoopik 5
selber 5
gennadi_s 2
Paulus73 2

Продолжить чтение "Новости за 2026-01-03 - 2026-01-09"

Объяснение PostgreSQL REGEXP_MATCH: синтаксис, примеры использования и подводные камни

Пересказ статьи DbVisualizer. PostgreSQL REGEXP_MATCH Explained: Syntax, Use Cases, Pitfalls


Regex является мощным средством обнаружения структуры внутри беспорядочных строк. PostgreSQL использует тут первоклассные функции регулярных выражений, включая REGEXP_MATCH для сопоставления и извлечения шаблонов.

Если вам когда-либо требовалось извлечь номер телефона из текста, проверить адрес электронной почты или захватить поименованный фрагмент строки, REGEXP_MATCH поможет вам сделать это за один шаг SQL.

Ниже приведен практический экскурс в специфику этой функции: синтаксис, возвращаемые значения, общие случаи использования и некоторые ошибки, которых следует избегать в продакшене. Продолжить чтение "Объяснение PostgreSQL REGEXP_MATCH: синтаксис, примеры использования и подводные камни"

Всматриваясь в ПРЕДСТАВЛЕНИЯ (VIEW)

Joe Celko, Looking at VIEWs, Close Up


Первые стандарты SQL-86 ввели немного «стандартного языка»: слово, которое продолжает использоваться до сих пор. Это слово — «эффективно». «Эффективно» используется для описания конечного эффекта оператора. Мы не определяем реализацию. Мы определяем результат. Вы, вероятно, предположили бы, что так должны делать все стандарты для языков, но стандарты как для FORTRAN, так и для COBOL изначально определяли непрерывное хранение и другие подобные детали реализации. Насколько мне известно, мы были первыми, кто отошёл от этой модели в стандарте SQL.



Представления (VIEW) — это виртуальные таблицы, определяемые оператором SELECT, и они должны эффективно вести себя так, как если бы результат этого оператора был реальной физической базовой таблицей. Это означало, что в любом месте грамматики, где разрешена таблица, вы можете использовать представление. Для данных представлений не выделяется место до тех пор, пока они не будут вызваны, поэтому они экономичны с точки зрения ресурсов.


К сожалению, большинство продуктов SQL показывают представления и базовые таблицы отдельно в своих обозревателях объектов, как если бы они были принципиально разными. Я подозреваю, что причина в том, что текст запроса должен быть сохранён (по причинам, которые мы рассмотрим через минуту), и поэтому он помещается в другую часть информационной схемы. Вероятно, просто проще не объединять базовые таблицы и представления для отображения в инструменте.


Синтаксис VIEW в Standard SQL



CREATE VIEW <имя таблицы> [(<список столбцов представления>)]
AS <выражение запроса>
[WITH [<уровневая клауза>] CHECK OPTION]
<уровневая клауза> ::= CASCADED | LOCAL


<view column list> необязателен; когда он не указан, представление унаследует имена столбцов из запроса. Количество имён столбцов в <view column list> должно совпадать со степенью (количеством столбцов) выражения запроса. Если какие-либо два столбца в запросе имеют одинаковое имя столбца, вы должны указать <view column list>, чтобы разрешить неоднозначность. Одно и то же имя столбца не может быть указано более одного раза.



Опция <levels clause> в WITH CHECK OPTION не существовала в SQL-89 и не влияет на запросы, а только на операторы UPDATE, INSERT INTO и DELETE FROM. Мы подробно рассмотрим эту недооценённую возможность. Она связана с вложенными представлениями и тем, как они «разворачиваются» при событии в базе данных.

Продолжить чтение "Всматриваясь в ПРЕДСТАВЛЕНИЯ (VIEW)"

Настройка производительности в Oracle: практические методы, которыми должен владеть каждый DBA

Пересказ статьи Udaya Veeramreddygari. Oracle Performance Tuning: Practical Techniques Every DBA Should Master


Как специалисты по базам данных, мы все сталкивались с этим ужасным моментом, когда пользователи начинают жаловаться на медленные запросы, и внезапно все смотрят на вас с выражением «исправьте это сейчас же». Настройка производительности Oracle может показаться невероятно сложной, особенно в условиях стресса, но хорошая новость состоит в том, что большинство проблем с производительностью возникают по нескольким распространённым причинам. Позвольте мне рассказать вам о нескольких проверенных методах, которые спасали мне жизнь больше раз, чем я могу сосчитать.

Начнем с самого простого: статистика и планы выполнения


Прежде чем перейти с сложным стратегиям настройки, всегда проверяйте актуальность вашей статистики. Оптимизатор Oracle на основе стоимости всецело опирается на точность статистики для принятия умных решений относительно путей выполнения запросов. Мне приходилось видеть запросы, которые выполнялись в 10 раз медленнее только потому, что кто-то забыл обновить статистику после загрузки большого объема данных. Продолжить чтение "Настройка производительности в Oracle: практические методы, которыми должен владеть каждый DBA"

Новости за 2025-12-27 - 2026-01-02

§ С Новым Годом, коллеги!
Здоровья и благополучия в новом году!


§ Популярные темы недели на форуме

Топик		Сообщений	Просмотров
25 (Learn) 6 10
122 (SELECT) 4 8
27 (Learn) 2 7

§ Авторы недели на форуме

Автор		Сообщений
pegoopik 7
selber 2
Rujan 2
Продолжить чтение "Новости за 2025-12-27 - 2026-01-02"

Ныряем в кроличью нору возможностей Postgres 18

Пересказ статьи Tudor Golubenco. Going down the rabbit hole of Postgres 18 features


Особое внимание в статье уделяется таким фундаментальным функциям, как инфраструктура асинхронного ввода-вывода и поддержка Oauth 2.0, оптимизации производительности, например, пропуску сканирования btree, а также долгожданным функциям, например, встроенной поддержке UUIDv7.

Но при свыше 3000 вкладах в релиз имеется множество других изменений помимо упомянутых, о которых вы можете захотеть узнать. Мы поставили себе задачу осветить как можно больше изменений и в итоге рассмотрели около 30 функций в этой длинной записи блога (почти 5000 слов).

Если вы все это не прочитаете, я вас не виню, итак, вот попытка на "слишком много букв":
Продолжить чтение "Ныряем в кроличью нору возможностей Postgres 18"