Index types in SQL Server
Clustered Index
Only
1 allowed per table physically rearranges the data in the table to
confirm to the index constraints for use on columns that are frequently
searched for ranges of data for use on columns with low selectivity.
Non-Clustered Index
Up
to 249 allowed per table creates a separate list of key values with
pointers to the location of the data in the data pages For use on
columns that are searched for single values
A
clustered index is a special type of index that reorders the way
records in the table are physically stored. Therefore table can have
only one clustered index. The leaf nodes of a clustered index contain
the data pages. A non-clustered index is a special type of index in
which the logical order of the index does not match the physical stored
order of the rows on disk. The leaf node of a non-clustered index does
not consist of the data pages. Instead, the leaf nodes contain index
rows.
Included Column Index (New in SQL Server 2005)
In
SQL Server 2005, the functionality of non-clustered indexes is extended
by adding non-key columns to the leaf level of the non-clustered index.
Non-key columns can help to create cover indexes. By including non-key
columns, you can create non-clustered indexes that cover more queries.
The Database Engine does not consider non-key columns when calculating
the number of index key columns or index key size. Non-key columns can
be included in non-clustered index to avoid exceeding the current index
size limitations of a maximum of 16 key columns and a maximum index key
size of 900 bytes. Another advantage is that using non-key column in
index we can have index data types not allowed as index key columns
generally.
In
following example column Filename is varchar(400), which will increase
the size of the index key bigger than it is allowed. If we still want to
include in our cover index to gain performance we can do it by using
the Keyword INCLUDE.
USE AdventureWorks
GO
CREATE INDEX IX_Document_Title
ON Production.Document (Title, Revision)
INCLUDE (FileName)
GO
CREATE INDEX IX_Document_Title
ON Production.Document (Title, Revision)
INCLUDE (FileName)
Non-key
columns can be included only in non-clustered indexes. Columns can’t be
defined in both the key column and they INCLUDE list. Column names
can’t be repeated in the INCLUDE list. Non-key columns can be dropped
from a table only after the non-key index is dropped first. For Included
Column Index to exist there must be at least one key column defined
with a maximum of 16 key columns and 1023 included columns.
Avoid
adding unnecessary columns. Adding too many index columns, key or
non-key as they will affect negatively on performance. Fewer index rows
will fit on a page. This could create I/O increases and reduced cache
efficiency. More disk space will be required to store the index. Index
maintenance may increase the time that it takes to perform
modifications, inserts, updates, or deletes, to the underlying table or
indexed view.
Another example to test:
Create following Index on Database AdventureWorks in SQL SERVER 2005
USE AdventureWorks
GO
CREATE NONCLUSTERED INDEX IX_Address_PostalCode
ON Person.Address (PostalCode)
INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID)
GO
Test the performance of following query before and after creating Index. The performance improvement is significant.
USE AdventureWorks
GO
CREATE NONCLUSTERED INDEX IX_Address_PostalCode
ON Person.Address (PostalCode)
INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID)
GO
Test the performance of following query before and after creating Index. The performance improvement is significant.
SELECT AddressLine1, AddressLine2, City, StateProvinceID, PostalCode
FROM Person.Address
WHERE PostalCode BETWEEN '98000'
AND '99999';
GO
FROM Person.Address
WHERE PostalCode BETWEEN '98000'
AND '99999';
GO
No comments:
Post a Comment