I saw this question in in Google Analytics from a Google search that hit our site.

So, how can you determice if an index is clustered or not? There are two ways, you can use either the INDEXPROPERTY function or the sysindexes/sys.sysindexes system table/view

To see how it works we will create a table with one clustered and one non clustered index on it

Here is the code for that

USE tempdb
go
 
CREATE TABLE Test (id INT, col1 VARCHAR(40), col2 INT, col3 INT)
go


CREATE NONCLUSTERED  INDEX ix_test ON test (id ASC, col1 DESC,col2 DESC, col3 ASC)
go
 
 
CREATE CLUSTERED  INDEX ix_test_clust ON test (id ASC, col1 DESC)
go

INDEXPROPERTY

To use INDEXPROPERTY you need to know the table ID, the name of the index and use IsClustered for the property. To get the table id, you use the OBJECT_ID function with the table name passed in

So for the index ix_test on table Test we will use INDEXPROPERTY(OBJECT_ID(‘Test’), ‘ix_test’,‘IsClustered’)

SELECT 'ix_test',INDEXPROPERTY(OBJECT_ID('Test'), 'ix_test','IsClustered')
union all
SELECT 'ix_test_clust',INDEXPROPERTY(OBJECT_ID('Test'), 'ix_test_clust', 'IsClustered')
Output
-------------------
ix_test     0
ix_test_clust   1

SYSINDEXES

indid holds the information needed to determine if the index is clustered or not

This info is for SQL Server 2000

_1 = Clustered index

1 = Nonclustered

255 = Entry for tables that have text or image data_

This info is for SQL Server 2005 and up

_0 = Heap

1 = Clustered index

1 = Nonclustered index_

select name,case indid when 1 then 'Clustered' else 'Non Clustered' end as TypeOfIndex
from sysindexes --or sys.sysindexes on sql 2005 and up
where name in( 'ix_test', 'ix_test_clust')
Output
-----------------------
name    TypeOfIndex
ix_test_clust   Clustered
ix_test Non Clustered

And of course you can combine the two methods

SELECT name,INDEXPROPERTY(id, name,'IsClustered')
from sysindexes 
where name in( 'ix_test', 'ix_test_clust')
Output
-------------
ix_test_clust   1
ix_test     0

As you can see it is pretty easy to determine if an index is a clustered index or a non clustered index. I prefer to use INDEXPROPERTY instead of SYSINDEXES, what about you?

*** If you have a SQL related question try our Microsoft SQL Server Programming forum or our Microsoft SQL Server Admin forum