#sql-server
#sql-server
Вопрос:
Я читал, что если я использую команду:
EXEC sp_updatestats
Что это создает статистику на основе примерно 20 000 строк в таблице. Я не уверен, что это значит, поскольку у меня много таблиц с менее чем 20 строками.
Может ли кто-нибудь дать мне совет о том, есть ли другой, более точный способ обновления статистики, который не потребует от меня ввода команды для каждой таблицы.
Комментарии:
1. Будьте более осторожны с источниками информации. Проверьте факты, прочитав авторитетные источники. Этот вопрос основан на ложном предположении.
Ответ №1:
Почему вы хотите собирать статистику другим способом, чем рекомендует Microsoft?
более точный способ обновления статистики, который не потребует от меня ввода команды для каждой таблицы
Эта команда обновляет статистику для всех таблиц в текущей базе данных, и вам не нужно вводить эту команду для каждой таблицы в базе данных:
EXEC sp_updatestats;
Также вы можете использовать команду ОБНОВИТЬ СТАТИСТИКУ. Я не знаю преимуществ UPDATE STATISTiCS по сравнению с sp_updatestats, и я думаю, что вы можете использовать их оба.
Это хороший способ собрать фактическую статистику для ваших данных, но имейте в виду, что это может быть трудоемкой операцией и потребовать много ресурсов сервера. Если это возможно, я рекомендую собирать статистику, когда большинство пользователей не работают с данными.
Другое решение для обслуживания (например, перестроение и реорганизация индексов) вы можете найти в этом сообщении.
Комментарии:
1. Спасибо за вашу помощь. Кто-то отклонил ваш ответ, но я поддержал и принял.
Ответ №2:
Следующий запрос показывает список таблиц, для которых необходимо обновить статистику. вы можете использовать курсор для результата этого запроса и обновлять статистику каждой таблицы, которая нуждается в обновлении статистики.
SELECT SchemaName, ObjectName, StatisticName, [RowCount], UpdatedCount
FROM (
SELECT SCHEMA_NAME(o.schema_id) AS SchemaName,
OBJECT_NAME(o.object_id) AS ObjectName,
s.Name AS StatisticName,
rows AS [RowCount],
modification_counter AS UpdatedCount,
modification_counter/rows * 100 AS UpdatePercent,
rows * -0.00001846153 19.538461 AS threshold
FROM sys.stats s
CROSS APPLY sys.dm_db_stats_properties(s.object_id, s.stats_id) b
INNER JOIN sys.objects o ON o.object_id = s.object_id
WHERE OBJECTPROPERTY(o.object_id,'IsUserTable')=1
)z
WHERE z.UpdatePercent > 20
OR (z.[RowCount]>=25000 AND z.[RowCount]<=1000000 AND z.UpdatePercent>2 AND z.UpdatePercent > z.threshold)
OR (z.[RowCount]>1000000 AND z.[RowCount]<=10000000 AND z.UpdatePercent>1)
OR (z.[RowCount]>10000000 AND z.[RowCount]<=20000000 AND z.UpdatePercent>0.5)
OR (z.[RowCount]>20000000 AND z.[RowCount]<=30000000 AND z.UpdatePercent>0.25)
ORDER BY z.UpdatePercent
Когда вы устанавливаете Auto Update Statistics
( ALTER DATABASE YourDatabase SET AUTO_UPDATE_STATISTICS ON
), sql server автоматически обновляет статистику вашей таблицы, когда количество обновленных строк составляет 20% от количества строк. на первый взгляд это кажется хорошим. Но 20% маленькой таблицы сильно отличаются от 20% большой таблицы. Другими словами, если в вашей таблице 100 строк, то при каждом обновлении 20 строк sql server автоматически обновляет статистику вашей таблицы, но если в вашей таблице 100 000 000 строк, при каждом обновлении 20 000 000 строк sql server автоматически обновляет статистику этой таблицы, и для этого обновления строк требуется очень много времени. Кажется, что маленькой таблице необходимо обновить статистику, когда количество обновленных строк составляло 20% от общего количества строк, а большой таблице необходимо обновить статистику, когда количество обновленных строк составляло 1% от общего количества строк. В моем запросе я показываю список таблиц, для которых требуется обновить статистику в соответствии с количеством строк таблицы и количеством строк обновления.