This script finds auto created statistics that duplicate existing stats generated by indexes, and may help to speed up your statistics maintenance.
Copy the results from the DropScript column to a new SSMS tab and execute.
This script finds auto created statistics that duplicate existing stats generated by indexes, and may help to speed up your statistics maintenance.
Copy the results from the DropScript column to a new SSMS tab and execute.
---------------------------------------------------------------------------------------------------
--Name:StatisticsDuplicateDrop.sql
--Purpose:To find autocreated stats that have an overlapping statistic, and generate a script to drop them.
--Notes:Auto created stats have only one column.
--History:
--mm/dd/yyyyInitDescription
-------------------------------------------------------------------------------------------
--02/13/2020PLSCreated
---------------------------------------------------------------------------------------------------
--Make CTEs
---------------------------------------------------------------------------------------------------
WITH
cteAutoStats
AS
(
SELECT
s.object_id
,s.name
,sc.column_id
FROM sys.stats AS s
JOIN sys.stats_columns AS sc
ON s.object_id = sc.object_id
AND s.stats_id = sc.stats_id
WHERE
s.auto_created = 1
AND sc.stats_column_id = 1
AND OBJECT_SCHEMA_NAME(s.object_id) != 'sys'
)
,cteUserStats
AS
(
SELECT
s.object_id
,s.name
,sc.column_id
FROM sys.stats AS s
JOIN sys.stats_columns AS sc
ON s.object_id = sc.object_id
AND s.stats_id = sc.stats_id
WHERE
s.auto_created = 0
AND sc.stats_column_id = 1
AND OBJECT_SCHEMA_NAME(s.object_id) != 'sys'
)
---------------------------------------------------------------------------------------------------
--Get results
---------------------------------------------------------------------------------------------------
SELECT DISTINCT
SchemaName = OBJECT_SCHEMA_NAME(cus.object_id)
,TableName = OBJECT_NAME(cus.object_id)
,ColumnName = c.name
,OverlappingStat = STUFF
(
(
SELECT '; ' + xmls.name
FROM cteUserStats AS xmls
WHERE
xmls.object_id = cus.object_id
AND xmls.column_id = cas.column_id
ORDER BY xmls.name
FOR XML PATH('')
)
,1
,1
,''
)
,DuplicateAutoStat = cas.name
,DropScript =
'USE ' + QUOTENAME(DB_NAME()) + '; DROP STATISTICS '
+ QUOTENAME(OBJECT_SCHEMA_NAME(cus.object_id))
+ '.' + QUOTENAME(OBJECT_NAME(cus.object_id))
+ '.' + QUOTENAME(cas.name)
FROM cteAutoStats AS cas
JOIN cteUserStats AS cus
ON cas.object_id = cus.object_id
AND cas.column_id = cus.column_id
JOIN sys.columns AS c
ON cus.object_id = c.object_id
AND cus.column_id = c.column_id
ORDER BY
SchemaName
,TableName
,ColumnName