에서 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
수 있습니다'%'
. 나는 단지 1-2 주 전에 그것을 물려 받았으며 교체 될 때까지 기본적으로 작동해야합니다. 링크 주셔서 감사합니다, 나는 그것을 소용돌이를 줄 것이다.