У меня есть хранилище данных 200 ГБ в SQL Server.
Я испытываю очень медленное время выполнения некоторых запросов; например 12 часов для простого delete
запроса с inner join
.
Проведя некоторые исследования с планами выполнения, я обновил статистику двух таблиц, задействованных в запросе, используя эту WITH FULLSCAN
опцию.
Теперь запрос выполняется менее чем за секунду, поэтому кажется, что статистика не была обновлена.
Я рассматриваю возможность отключения auto update statistics
базы данных и запуска UPDATE STATISTICS
вручную после загрузки хранилища данных. Хранилище данных загружается постепенно из исходной ERP-системы ежедневно, ночью.
Правильно ли я предположить, что auto update statistics
в сценариях хранилищ данных не очень полезно? Вместо этого, имеет ли смысл обновлять статистику вручную после загрузки данных?
Ответы:
Вот технический документ, когда происходит автоматическое обновление статистики . Вот основные моменты в отношении автоматических обновлений статистики:
Таким образом, @JNK указал в комментарии, что если у вас есть 1 миллиард строк в таблице, вам потребуется 20 000 5 000 записей в первый столбец статистики, чтобы запустить обновление.
Давайте возьмем следующую структуру:
Теперь мы можем проверить, что произошло в статистике земли.
Однако, чтобы увидеть, является ли это значимым статистическим объектом, нам нужно:
Так что эта статистика не была обновлена. Это потому, что похоже, что статистика не обновляется до тех пор, пока не
SELECT
произойдет, и даже тогдаSELECT
она должна выходить за пределы того, что SQL Server имеет в своей гистограмме. Вот тестовый скрипт, который я запустил, чтобы проверить это:Вместо того, чтобы слепо отключать статистику auto_update, я бы попытался проверить ваш набор данных на перекос. Если ваши данные демонстрируют значительный перекос, то вам нужно подумать о создании отфильтрованной статистики, а затем решить, является ли управление обновлениями статистики вручную правильным способом.
Чтобы проанализировать асимметрию, вам нужно запустить
DBCC SHOW_STATISTICS(<stat_object>, <index_name>);
(в приведенном выше сценарии безWITH STAT_HEADER
) конкретную комбинацию stat / index, которую вы хотели бы изучить. Быстрый способ оценить ваш перекос - это посмотреть на гистограмму (третий набор результатов) и проверить отклонения в вашемEQ_ROWS
. Если он достаточно последовательный, то ваш перекос минимален. Чтобы увеличить его, вы посмотрите наRANGE_ROWS
столбец и посмотрите на отклонения, так как это измеряет, сколько строк существует между каждым шагом. Наконец, вы можете взять[All density]
результат изDENSITY_VECTOR
(второго набора результатов) и умножить его на[Rows Sampled]
значение вSTAT_HEADER
(первом наборе результатов) и посмотреть, каким будет среднее ожидание для запроса по этому столбцу. Вы сравниваете это среднее с вашимEQ_ROWS
и если есть много мест, где это значительно меняется, то у вас есть перекос.Если вы обнаружите, что у вас действительно есть перекос, то вам нужно подумать о создании некоторой отфильтрованной статистики по диапазонам, которые имеют очень высокий и высокий значения,
RANGE_ROWS
чтобы вы могли дать дополнительные шаги для более точных оценок этих значений.После того, как у вас есть эти отфильтрованные статистические данные, вы можете посмотреть на возможность ручного обновления статистики.
источник