จากMSDN :
"การแทรกการดำเนินงานเกิดขึ้นจากการขึ้นหรือลงจากคอลัมน์คีย์คอลัมน์
สถิติในการขึ้นหรือลงจากคอลัมน์คีย์เช่น IDENTITY หรือคอลัมน์เวลาประทับตามเวลาจริงอาจต้องการการอัปเดตสถิติบ่อยกว่าการเพิ่มประสิทธิภาพการสืบค้นแบบสอบถาม จำนวนแถวที่เพิ่มอาจมีขนาดเล็กเกินไปที่จะทริกเกอร์การอัปเดตสถิติหากสถิติไม่ใช่ข้อมูลล่าสุดและแบบสอบถามเลือกจากแถวที่เพิ่มล่าสุดสถิติปัจจุบันจะไม่มีการประมาณการเชิงการนับสำหรับค่าใหม่เหล่านี้ ส่งผลให้การประเมินความผิดพลาดของ cardinality ไม่ถูกต้องและประสิทธิภาพการสืบค้นช้า
ตัวอย่างเช่นแบบสอบถามที่เลือกจากวันที่สั่งซื้อล่าสุดจะมีการประเมินความผิดปกติของ cardinality ที่ไม่ถูกต้องหากสถิติไม่ได้รับการอัพเดตเพื่อรวมการประเมิน cardinality สำหรับวันที่สั่งซื้อล่าสุด
หลังจากการดำเนินการบำรุงรักษาให้
พิจารณาอัปเดตสถิติหลังจากดำเนินการตามขั้นตอนการบำรุงรักษาที่เปลี่ยนการกระจายข้อมูลเช่นตัดทอนตารางหรือทำการแทรกจำนวนมากของแถวขนาดใหญ่ สิ่งนี้สามารถหลีกเลี่ยงความล่าช้าในอนาคตในการประมวลผลแบบสอบถามในขณะที่แบบสอบถามรอการปรับปรุงสถิติอัตโนมัติ "
คุณอาจใช้ "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
'%'
ฉันเพิ่งรับช่วงสองหรือสามสัปดาห์ที่ผ่านมาและต้องให้มันทำงานโดยทั่วไปจนกว่าจะถูกแทนที่ ขอบคุณสำหรับลิงค์ฉันจะให้มันหมุนวน