Что такое статистика в SQL?

Ответ

Статистика в SQL — это метаданные, которые СУБД собирает о распределении данных в таблицах и индексах. Эти данные критически важны для оптимизатора запросов, который использует их для выбора наиболее эффективного плана выполнения (например, какой индекс использовать или какой тип соединения применить).

Основные виды статистики:

  • Гистограммы: Показывают, как часто встречаются различные значения в столбце. Помогают оценить селективность условий WHERE.
  • Плотность: Вероятность встретить конкретное значение. Обратно пропорциональна кардинальности.
  • Кардинальность: Оценка количества уникальных значений в столбце или комбинации столбцов.

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

-- SQL Server: обновить статистику для таблицы с полным сканированием
UPDATE STATISTICS Sales.Orders WITH FULLSCAN;

-- SQL Server: создать статистику по нескольким столбцам
CREATE STATISTICS stats_OrderDate_CustomerID ON Sales.Orders (OrderDate, CustomerID);

-- PostgreSQL: обновить статистику с помощью ANALYZE
ANALYZE orders;

Важно: Хотя современные СУБД (SQL Server, PostgreSQL) имеют фоновые процессы автоматического обновления статистики, в высоконагруженных системах или после массовых изменений данных часто требуется ручное управление и мониторинг.

Ответ 18+ 🔞

Давай разжую про статистику в SQL, чтобы понятно стало, как эта магия работает под капотом. Представь, что оптимизатор запросов — это такой дохуя умный, но слеповатый таксист. А статистика — это его навигатор, карты и сводка пробок. Без неё он поедет через всю Москву в час пик, а не по Садовому, и привезёт тебя через три часа и все бабки проебёт на бензин.

Что это вообще такое? Это не просто цифры, блядь. Это метаданные, которые СУБД сама насобирала про твои таблицы: какие значения в столбцах, сколько их, как они разбросаны. Оптимизатор, тот самый таксист, смотрит в эту сводку и решает: "Ага, тут в условии WHERE status = 'completed', а статистика говорит, что таких записей всего 5%, значит, можно смело использовать индекс, а не сканировать всю таблицу, как последний идиот".

Основные фишки, которые она знает:

  • Гистограммы: Это как разбить все значения в столбце на корзины и посчитать, сколько чего в каждой. Типа, в корзине "цены от 100 до 200" — 10 тысяч записей, а в корзине "от 1000 до 1100" — всего 3. Понятно, что фильтр по первой корзине вернёт дохуя данных, а по второй — почти ничего. Без этого оптимизатор — как пьяный в темноте.
  • Плотность и кардинальность: Кардинальность — это оценка, сколько у тебя уникальных значений. Если в столбце "пол" всего 2 значения ('M', 'F'), то кардинальность низкая, а плотность высокая (вероятность встретить конкретное значение — 50%). Если в столбце "email" все значения уникальные — кардинальность высокая, а плотность — хуйова. Это нужно, чтобы понять, насколько эффективен будет индекс.

А теперь самое важное — управление этой хуйней. Статистика имеет мерзкую привычку устаревать. Представь: у тебя было 1000 заказов, статистика это знает. Ты за ночь накидал ещё миллион. Оптимизатор просыпается, смотрит в свои вчерашние бумажки, где написано "записей немного", и решает: "О, да тут можно вообще всё в оперативке отсортировать, план идеальный!". А на деле запрос начинает жрать память и диски как не в себя, и всё встаёт колом. Пиздец, а не производительность.

Поэтому её иногда надо пинать. Вручную.

-- В SQL Server: заставить пересчитать статистику по таблице, проанализировав ВСЕ строки (FULLSCAN). Может долго, зато точно.
UPDATE STATISTICS Sales.Orders WITH FULLSCAN;

-- Создать статистику по паре столбцов, если догадываешься, что их связь важна для запросов.
CREATE STATISTICS stats_OrderDate_CustomerID ON Sales.Orders (OrderDate, CustomerID);

-- В PostgreSQL: просто делаешь ANALYZE по таблице, и он быстренько пробежится, оценит распределение.
ANALYZE orders;

Итог, чувак: Да, современные базы (SQL Server, PostgreSQL) пытаются быть умными и сами иногда обновляют эту статистику в фоне. Но это как автополив для цветов: в обычную погоду хватает, а в жару — нихуя. После больших паков данных, массовых удалений или глобальных обновлений — обязательно проверяй и при необходимости обновляй статистику вручную. Иначе будешь потом неделю гадать, почему запрос, который вчера летал, сегодня еле ползает. А причина — таксист-оптимизатор поехал по вчерашней карте, а там уже всё изменилось.