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

Popular posts from this blog

SysDictField object not initialized. - Views

How to filter data for the last few weeks?

Get the value of Month or YY in SysComputedCOlumns in AX views