發現有一個Database, 老是會發生其某張Table的JOINL SQL Server Optimzer老是選取不好的執行計畫, Index也已最佳化, 果斷想到是統計值問題.
但是更新統計值問題後, 問題仍然存在.
原來是重複統計值問題!
以下建立一個Job, 定期清理由系統自行建立的重複統計值
--找尋是否有同一個欄位名稱的統計值重複,如果有建立刪除語法
DECLARE @EXEC NVARCHAR(2000)
DECLARE MYCURSOR CURSOR
FOR
WITH autostats (
object_id
,stats_id
,name
,column_id
)
AS (
SELECT sys.stats.object_id
,sys.stats.stats_id
,sys.stats.name
,sys.stats_columns.column_id
FROM sys.stats
INNER JOIN sys.stats_columns ON sys.stats.object_id = sys.stats_columns.object_id
AND sys.stats.stats_id = sys.stats_columns.stats_id
WHERE sys.stats.auto_created = 1
AND sys.stats_columns.stats_column_id = 1
)
SELECT 'DROP STATISTICS [' + OBJECT_SCHEMA_NAME(sys.stats.object_id) + '].[' + OBJECT_NAME(sys.stats.object_id) + '].[' + autostats.name + ']'
FROM sys.stats
INNER JOIN sys.stats_columns ON sys.stats.object_id = sys.stats_columns.object_id
AND sys.stats.stats_id = sys.stats_columns.stats_id
INNER JOIN autostats ON sys.stats_columns.object_id = autostats.object_id
AND sys.stats_columns.column_id = autostats.column_id
INNER JOIN sys.columns ON sys.stats.object_id = sys.columns.object_id
AND sys.stats_columns.column_id = sys.columns.column_id
WHERE sys.stats.auto_created = 0
AND sys.stats_columns.stats_column_id = 1
AND sys.stats_columns.stats_id != autostats.stats_id
AND OBJECTPROPERTY(sys.stats.object_id, 'IsMsShipped') = 0;
OPEN MYCURSOR
FETCH NEXT
FROM MYCURSOR
INTO @EXEC
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT (@EXEC)
EXEC (@EXEC)
FETCH NEXT
FROM MYCURSOR
INTO @EXEC
END
CLOSE MYCURSOR
DEALLOCATE MYCURSOR
Reference: https://dotblogs.com.tw/stanley14/2018/01/14/statistics_overlapping
Share on Twitter Share on FacebookSQL Server Analytics Service 1
SEO(1) Github(2) Title Tag(2) ML(1) 李宏毅(1) SQL Server(18) Tempdb(1) SSMS(1) Windows(1) 自我成長(2) Excel(1) python Flask(1) python(5) Flask(2)
Max Chen (159)