Script for Unused Indexes
DECLARE
@DATABASENAME VARCHAR(2000),
@DBID INT,
@SQL VARCHAR(4000),
@STATUS SQL_VARIANT
IF OBJECT_ID ('TEMPDB..##TBLDB') IS NOT NULL
DROP TABLE TEMPDB..##TBLDB
/* CREATING A TEMP TABLE*/
CREATE TABLE ##TBLDB(TABLENAME VARCHAR(200), INDEXNAME VARCHAR(200), INDEXID INT,DATABASENAME VARCHAR(200))
/* CURSIN THROUGH ALL THE DATABASES ON THE SERVER*/
DECLARE CURSOR_DATABASES CURSOR FOR
SELECT
NAME, DATABASE_ID
FROM
SYS.DATABASES
WHERE
NAME NOT IN ('MASTER','MODEL','MSDB','TEMPDB')
OPEN CURSOR_DATABASES
FETCH NEXT FROM CURSOR_DATABASES INTO @DATABASENAME,@DBID
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @Status = DatabasePropertyEX(@DATABASENAME, 'Status')
IF @STATUS = 'ONLINE'
/*THIS SCRIPT GETS A LIST OF ALL THE INDEXES THAT ARE NOT BEING USED*/
BEGIN
SET @SQL = 'INSERT INTO ##TBLDB
SELECT
O.NAME AS TABLENAME,
INDEXNAME = I.NAME,
I.INDEX_ID,
DATABASENAME = '''+ @DATABASENAME +
''' FROM '+ @DATABASENAME + '.SYS.INDEXES I
INNER JOIN ' + @DATABASENAME +
'.SYS.OBJECTS O
ON I.OBJECT_ID = O.OBJECT_ID
LEFT JOIN
SYS.DM_DB_INDEX_USAGE_STATS S
ON S.OBJECT_ID = I.OBJECT_ID
AND I.INDEX_ID = S.INDEX_ID
WHERE
O.TYPE_DESC = ''USER_TABLE''
AND I.NAME IS NOT NULL
AND I.NAME <> ''pk_dtproperties''
AND ISNULL(S.USER_SCANS, 0) = 0
AND ISNULL(S.USER_SEEKS, 0) = 0
AND ISNULL(S.SYSTEM_SCANS, 0) = 0
AND DATABASE_ID = '+ CONVERT(VARCHAR(100),@DBID) + '
ORDER BY O.NAME,
I.INDEX_ID,
INDEXNAME ASC'
EXEC (@SQL)
END
FETCH NEXT FROM CURSOR_DATABASES INTO @DATABASENAME,@DBID
END
CLOSE CURSOR_DATABASES
DEALLOCATE CURSOR_DATABASES
SELECT * FROM ##TBLDB
DROP TABLE ##TBLDB
Comments
Post a Comment