1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
| SET NOCOUNT ON
GO
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
GO
-------------------------------------------------------------------------------------------------------
DECLARE @recompute bit = 1 -- xml_partner_ratefix_filters
-------------------------------------------------------------------------------------------------------
IF (SELECT OBJECT_ID('TEMPDB.dbo.#STALE_STAT')) IS NOT NULL
BEGIN
DROP TABLE #STALE_STAT
END
;WITH
SRT(low_boundary, high_boundary, threshold) AS
(
SELECT V.low_boundary
, V.high_boundary
, V.threshold
FROM (
VALUES (1, 1000, 0.1)
, (1001, 5000, 0.0800)
, (5001, 10000, 0.0750)
, (10001, 50000, 0.0700)
, (50001, 100000, 0.0650) -- 50,000 and 100,000
, (100001, 250000, 0.0625) -- 100,001 and 250,000
, (250001, 500000, 0.0600) -- 250,000 and 500,000
, (500001, 1000000, 0.0575) -- 500,001 and 1,000,000
, (1000001, 2500000, 0.0550) -- 1,000,001 and 2,500,000
, (2500001, 5000000, 0.0525) -- 2,500,001 and 5,000,000
, (5000001, 7500000, 0.0500) -- 5,000,001 and 7,500,000
, (7500001, 10000000, 0.0475) -- 7,500,001 and 10,000,000
, (10000001, 25000000, 0.0450) -- 10,000,001 and 25,000,000
, (25000001, 50000000, 0.0425) -- 25,000,001 and 50,000,000
, (50000001, 75000000, 0.0400) -- 50,000,001 and 75,000,000
, (75000001, 100000000, 0.0375) -- 75,000,001 and 100,000,000
, (100000001, 250000000, 0.0350) -- 100,000,001 and 250,000,000
, (250000001, 500000000, 0.0325) -- 250,000,001 and 500,000,000
, (500000001, 750000000, 0.0300) -- 500,000,001 and 750,000,000
, (750000000, 1000000000, 0.0275) -- 750,000,001 and 1,000,000,000
) AS V(low_boundary, high_boundary, threshold)
)
, OBSOLETE_STAT AS
(
SELECT S.name AS schema_name
, O.name AS object_name
, QUOTENAME(D.name) AS stat_name
, LEFT(SC.stat_column_list, LEN(SC.stat_column_list) - 1) AS stat_column_list
, D.filter_definition
, PS.row_count
, SI.rowmodctr
, CAST((100 * CAST(SI.rowmodctr AS float)) / CASE PS.row_count WHEN 0 THEN 1 ELSE PS.row_count END AS decimal(13,2)) AS [gap_%]
, CAST(SRT.threshold * 100 AS decimal(5, 2)) AS pct
, CAST(PS.row_count * SRT.threshold AS bigint) AS SRT
, STATS_DATE(D.object_id, D.stats_id) AS last_update
FROM sys.schemas AS S
INNER JOIN sys.objects AS O
ON S.schema_id = O.schema_id
INNER JOIN sys.stats AS D
ON O.object_id = D.object_id
INNER JOIN (
SELECT object_id
, MAX(row_count) AS row_count
FROM sys.dm_db_partition_stats AS PS
GROUP BY object_id
) AS PS
ON PS.object_id = O.object_id
INNER JOIN sys.sysindexes AS SI WITH (FORCESEEK)
ON SI.id = D.object_id
AND SI.indid = D.stats_id
INNER JOIN SRT
ON PS.row_count BETWEEN SRT.low_boundary AND SRT.high_boundary
AND SI.rowmodctr > PS.row_count * SRT.threshold
CROSS APPLY (
SELECT C.name + ','
FROM sys.stats AS S
INNER JOIN sys.stats_columns AS SC
ON S.object_id = SC.object_id
AND S.stats_id = SC.stats_id
INNER JOIN sys.columns AS C
ON C.object_id = SC.object_id
AND C.column_id = SC.column_id
WHERE D.name = S.name
ORDER BY SC.stats_column_id
FOR XML PATH ('')
) AS SC (stat_column_list)
WHERE S.name <> 'sys'
AND O.type IN ('U', 'V') -- user table or indexed view
)
SELECT schema_name
, object_name
, stat_name
, last_update
, stat_column_list
, filter_definition
, row_count
, rowmodctr
INTO #STALE_STAT
FROM OBSOLETE_STAT
OPTION (RECOMPILE)
SELECT *
FROM #STALE_STAT
IF @recompute = 1
BEGIN
DECLARE @sql nvarchar(max)
SELECT @sql = CASE
WHEN @sql IS NULL THEN ''
ELSE @sql
END + ';UPDATE STATISTICS ' + QUOTENAME(schema_name) + '.' + QUOTENAME(object_name) + '(' + stat_name + ')'
FROM #STALE_STAT
PRINT @sql
EXEC (@sql)
END |
Partager