Изменения в автоматическом обновлении статистики SQL Server -T2371Источник: msmvps msmvps
По материалам статьи Juergen Thomas: Changes to automatic update statistics in SQL Server - traceflag 2371 C 1998 года, когда вышел SQL Server 7.0, базовым принципом дизайна автоматического обновления статистики было отслеживание количества изменений в таблице. Когда количество изменений в таблице превышало определённый порог (процент), выполнялось автоматическое обновление статистики. Изначально, в версиях SQL Server 2008 и 2008 R2 не было никаких крупных изменений в дизайне сбора и использования статистики. Появившийся ещё во времена разработки SQL Server 7.0 алгоритм, основанный на фиксированном пороговом значении, остался без существенных изменений. Превышение этого порога вызывало автоматическое обновление статистики. Пороговое значение, используемое изначально, равнялось 20%, и оно оставалось таким во всех выпусках SQL Server, которые до недавнего времени появлялись на рынке. Это означает, что до недавнего времени все выпуски SQL Server инициировали процедуру автоматического обновления статистики, если для столбца таблицы были зафиксированы изменения, которые затрагивали более 20% от числа строк таблицы. Обновлению подлежит индекс на основе B-дерева, который включает такой столбец в качестве первого столбца индекса, или если существует отдельная статистика для этого столбца среди относящихся к таблице статистик столбцов. Индексы, в которых не участвует этот столбец в качестве первого (ведущего) столбца индекса, не нуждаются в обновлении статистики. Ещё одно ограничение, это реализация в коде SQL Server 7.0 специальных защитных мер для маленьких таблиц от частого обновления статистики. Требуется, чтобы в таблице было, по меньшей мере, 500 строк (6 строк для временных таблиц), тогда автоматический пересчёт статистики у этой таблицы будет происходить после превышения двадцатипроцентного порога изменений. Как автоматическое обновление статистики используется приложениями SAPSAP взяло на вооружение автоматическое обновление статистики сразу же после его появления, и десятки тысяч клиентов много лет с успехом использовали эту функциональность в своих приложениях на базе SAP Netweaver. Это положение заметно отличается от других СУБД, для которых обновление статистики у таблиц необходимо планировать как постоянную задачу. Компания SAP рекомендует использовать эту функциональность SQL Server в полном объёме и для всех своих приложений. Применительно к SAP BW существовали небольшие проблемы с тем, что требовалось иметь в таблице не меньше 500 строк. Поэтому в SAP BW были разработаны и документированы специальные процессы, предназначенные осуществлять дополнительное обновление статистики там, где не работало автоматическое обновление статистики. Документ называется: SAP OSS Note №849062 - "Optimizer statistics for InfoCubes in BW". Однако, для заказчиков систем SAP сегодня характерно увеличение объёмов данных, поддержка 64-разрядности и общая тенденция использования платформы Intel для обработки большого количества информации, необходимой бизнес - приложениям. С SAP ERP сегодня работает большое количество клиентов, а некоторые таблицы могут содержать миллиарды строк. Во многих случаях приходится сталкиваться с ситуациями, когда автоматическое обновление статистики с фиксированным порогом 20% требует изменения сотен миллионов строк в таблице, и только после этого будет запущено очередное автоматическое обновление статистики. В результате пользователи жаловались, что обновление статистики выполняется крайне редко, устаревшая статистика иногда приводит к использованию неоптимальных планов исполнения запросов. Новое решениеВ SP1 для SQL Server 2008 R2 и в последующих версиях SQL Server можно использовать флаг трассировки, который изменяет фиксированный порог обновления статистики 20% на динамически изменяющуюся величину процента изменений таблицы. Чем в таблице больше строк, тем ниже порог обновления статистики. Например, если этот флаг трассировки активирован, процедура автоматического обновления статистики для таблицы с миллиардом строк будет выполнена при изменении миллиона строк. Если же флаг трассировки не активирован, та же таблица с миллиардом записей не получит автоматического обновления статистики, пока в ней не накопится 200 миллионов изменений. Для того чтобы активировать эту новую возможность, нужно включить флаг трассировки 2371. После этого, порог для триггера обновления статистики будет зависеть от числа строк в таблице. Однако, требование того, что в таблице для возможности автоматического обновления статистики должно быть не меньше 500 строк, сохраняется. Как и прежде, обновление статистики будет запускаться на основании результатов исследования пробной выборки значений, предустановленной величины, которая динамически изменяется в зависимости от числа строк в таблице. Более подробно о том, что даёт использование флага трассировки 2371На представленном ниже графике видно, как работает новая функциональность. Для небольших таблиц порог по-прежнему будет примерно 20%. Только когда таблица превысит 25000 строк, начнёт действовать динамическое изменение порога срабатывания, когда при увеличении количества строк, процент изменённых записей становится все ниже и ниже. Например, в таблице с 100000 строк порог для триггера обновления статистики будет снижен до 10%. В таблице с 1000000 строк потребуется изменить около 3,2%, после чего сработает триггер автоматического обновления статистики. Последствия включения флага трассировкиКак было показано выше, автоматическое обновление статистики будет выполняться чаще для тех таблиц, у которых изменения происходят с высокой частотой. Недостатком такого подхода является то, что обновление статистики приводит к перекомпиляции запросов, относящихся к этой таблице. Это может повысить риски получения другого плана исполнения запроса при повторном его исполнении. С другой стороны, динамический порог для триггера обновления статистики необходимо рассматривать как средство, призванное решать известные проблемы выбора оптимального плана для нового месяца или нового финансового года, когда статистика ещё актуальна для месяца предыдущего отчётного периода. |