Від MSDN :
" Операції " Вставка " відбуваються на
висхідних або низхідних стовпцях ключових стовпців. Збільшення або зменшення стовпців ключових значень, таких як ІДЕНТИЧНІСТЬ або стовпці часових міток у режимі реального часу, можуть вимагати більш частого оновлення статистики, ніж виконує оптимізатор запитів. . Кількість доданих рядків може бути занадто малою, щоб викликати оновлення статистики. Якщо статистика не є актуальною, а запити вибираються з останніх доданих рядків, поточна статистика не матиме оцінок кардинальності для цих нових значень. Це може приводить до неточних оцінок кардинальності та повільному виконанню запитів.
Наприклад, запит, який вибирає з останніх дат замовлення на продаж, матиме неточні оцінки кардинальності, якщо статистичні дані не оновлюються для включення оцінок кардинальності за останніми датами замовлення на продаж.
Після операцій технічного обслуговування
Розгляньте оновлення статистичних даних після виконання процедур технічного обслуговування, що змінюють розподіл даних, наприклад, обрізання таблиці або виконання об'ємної вставки великого відсотка рядків. Це дозволяє уникнути майбутніх затримок в обробці запитів, поки запити чекають автоматичних оновлень статистики. "
Ви можете час від часу використовувати "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
можливо'%'
. Я просто успадкував його тиждень-два тому, і потрібно тримати його в основному, поки він не заміниться. Дякую за посилання, я дам йому кружляння.