Из MSDN :
« Операции вставки происходят в восходящих или нисходящих ключевых столбцах
Статистика в восходящих или нисходящих ключевых столбцах, таких как столбцы IDENTITY или отметка времени в реальном времени, может потребовать более частых обновлений статистики, чем выполняет оптимизатор запросов. Операции вставки добавляют новые значения в восходящие или нисходящие столбцы Число добавленных строк может быть слишком маленьким, чтобы вызвать обновление статистики. Если статистика не актуальна и запросы выбираются из последних добавленных строк, текущая статистика не будет иметь оценки количества элементов для этих новых значений. приводят к неточным оценкам мощности и снижению производительности запросов.
Например, запрос, который выбирается из самых последних дат заказа на продажу, будет иметь неточные оценки количества элементов, если статистика не будет обновлена, чтобы включить оценки количества элементов для самых последних дат заказа на продажу.
После операций обслуживания
Рассмотрите возможность обновления статистики после выполнения процедур обслуживания, которые изменяют распределение данных, таких как усечение таблицы или массовая вставка большого процента строк. Это поможет избежать будущих задержек в обработке запросов, пока запросы ждут автоматических обновлений статистики. "
Вы можете время от времени использовать «EXEC sp_updatestats» в вашей системе (запланировано некоторое время) или использовать функцию STATS_DATE для всех объектов и посмотреть, когда их статистика действительно обновлялась в последний раз, и с тех пор было слишком много времени, используйте UPDATE. СТАТИСТИКА для этого конкретного объекта. По моему опыту, даже при включенной автоматической статистике мы все равно вынуждены время от времени обновлять статистику из-за операций вставки, которые не запускали автоматическое обновление.
Чтобы добавить мой личный код (используется в еженедельной работе, которая создает динамические отчеты для обновления статистики):
select distinct
'update statistics [' + stats.SchemaName + '].[' + stats.TableName + ']'
+ case when stats.RowCnt > 50000 then ' with sample 30 percent;'
else
';' end
as UpdateStatement
from (
select
ss.name SchemaName,
so.name TableName,
so.id ObjectId,
st.name AS StatsName,
STATS_DATE(st.object_id, st.stats_id) AS LastStatisticsUpdateDate
, si.RowModCtr
, (select case si2.RowCnt when 0 then 1 else si2.RowCnt end from sysindexes si2 where si2.id = si.id and si2.indid in (0,1)) RowCnt
from sys.stats st
join sysindexes si on st.object_id = si.id and st.stats_id = si.indid
join sysobjects so on so.id = si.id and so.xtype = 'U' --user table
join sys.schemas ss on ss.schema_id = so.uid
) stats
where cast(stats.RowModCtr as float)/cast(stats.RowCnt as FLOAT)*100 >= 10 --more than 10% of the rows have changed
or ( --update statistics that were not updated for more than 3 months (and rows no > 0)
datediff(month, stats.LastStatisticsUpdateDate, getdate()) >= 3
and stats.RowCnt > 0
)
Здесь я получаю все объекты, у которых статистика не обновлялась более 3 месяцев или с момента последнего обновления статистики изменилось более 10% строк.
where col=(cast @var...)
) и@var
может быть'%'
. Я унаследовал это неделю или две назад, и мне нужно, чтобы он работал в основном до тех пор, пока он не будет заменен. Спасибо за ссылку, я приведу ее в движение.