Karthick P.K on SQL Server

Using DMVs to find out the index usage history- SQLServer Index Usage

Posted by Karthick P.K on March 10, 2009

SQLserver 2005 ships with a set of DMVs that can help you identify the missing indexes for your workload, Analyze the effectiveness of the existing ones and help find out index fragmentation.

Using DMVs to find out the index usage history

Over a period of time, you could create a lot of indexes on your tables and modify existing ones. However, in SQL 2000, you couldn’t estimate how effective were each of these indexes. Poorly design indexes could lead to performance overhead instead of enhancing performance.

In SQL 2005, you can query the sys.dm_db_index_usage_stats DMV to find out the indexes that have NEVER been used since the last start of SQL Server. You can use the following query to find that out:

 1: select object_name(i.object_id) as ObjectName,


 2: as IndexName, s.user_updates, s.user_seeks, s.user_scans,


 3: s.user_lookups


 4: from sys.indexes i


 5: left join sys.dm_db_index_usage_stats s


 6: on s.object_id = i.object_id and i.index_id = s.index_id and s.database_id =


 7: <dbid>


 8: where objectproperty(i.object_id, 'IsIndexable') = 1 and


 9: -- index_usage_stats has no reference to this index (not being used)


 10: s.index_id is null or


 11: -- index is being updated, but not used by seeks/scans/lookups


 12: (s.user_updates > 0 and s.user_seeks = 0


 13: and s.user_scans = 0 and s.user_lookups = 0)


 14: order by object_name(i.object_id) asc


In the output, you will ALL the indexes that have never been used by any sort of workload on your server, since the last start of SQL Server.

For indexes that have NEVER been used (either for a SELECT or a DML statement), all columns will be NULL

For indexes that have NEVER been used (for a SELECT), but had to be updated due to a DML statement, the user_updates column will be >0, while other columns will be 0. It is these indexes that could cause severe performance overhead for your DML statements and might be worth dropping.

Give ample time for SQL Server to get exposed to all the workload after a restart, before running this query.

Using DMVs to find out missing indexes

When the query optimizer generates a query plan, it analyzes what are the best indexes for a particular filter condition. If the best indexes do not exist, the query optimizer generates a suboptimal query plan, but still stores information about these indexes. The missing indexes feature enables you to access information about these indexes so you can decide whether they should be implemented.

For more information on how to use this feature, please visit the following link


Using DMVs to find out index fragmentation

The sys.dm_db_index_physical_stats dynamic management function replaces the DBCC SHOWCONTIG statement.

You can learn more about using this DMV to identify fragmentation, correcting it and possibly automating this activity for your server by visiting the following link:


Karthick P.K

One Response to “Using DMVs to find out the index usage history- SQLServer Index Usage”

  1. Bonnie said

    Good way of describing, and good paragraph to get facts on the topic
    of my presentation topic, which i am going to deliver in college.

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: