Вопрос проверяет понимание влияния устаревшей статистики на производительность запросов в базах данных.
Планировщик запросов в базах данных, таких как PostgreSQL или MySQL, использует статистику для оценки стоимости различных планов выполнения. Статистика включает информацию о количестве строк, распределении значений и других метриках. Когда статистика устаревает, планировщик может принимать неверные решения, что приводит к медленным запросам.
Предположим, у нас есть таблица с миллионом записей, и мы удалили 90% данных, но не обновили статистику. Планировщик все еще думает, что в таблице миллион строк, и может выбрать последовательное сканирование, хотя индексное сканирование было бы быстрее. Пример:
-- Создаем таблицу и вставляем данные
CREATE TABLE orders (id SERIAL, status TEXT);
INSERT INTO orders (status) SELECT 'active' FROM generate_series(1, 1000000);
-- Удаляем большинство строк
DELETE FROM orders WHERE id > 100000;
-- Без обновления статистики планировщик может выбрать плохой план
EXPLAIN ANALYZE SELECT * FROM orders WHERE status = 'active';
-- Обновляем статистику
ANALYZE orders;
-- Теперь план будет оптимальным
EXPLAIN ANALYZE SELECT * FROM orders WHERE status = 'active';
Устаревшая статистика особенно критична в системах с частыми операциями вставки, обновления или удаления. Регулярное выполнение команды ANALYZE или настройка автоматического сбора статистики помогает поддерживать актуальность данных для планировщика.
Вывод: Поддержание актуальной статистики — ключевой аспект оптимизации производительности баз данных. Это особенно важно в OLTP-системах с динамическими данными, где неверные планы могут значительно замедлить работу приложений.