included columns with sql server
indices.
Clustered Index
Only 1 allowed per table
Physically rearranges the data in the table to conform to the index constraints
For use on columns that are frequently searched for ranges of data
For use on columns with low selectivity
Only 1 allowed per table
Physically rearranges the data in the table to conform 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
For use on columns with high selectivity
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
For use on columns with high selectivity
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 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 AdventureWorksGOCREATE INDEX IX_Document_TitleON 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 the 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 AdventureWorksGOCREATE NONCLUSTERED INDEX
IX_Address_PostalCodeON 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, PostalCodeFROM Person.AddressWHERE PostalCode BETWEEN '98000'AND '99999';GO
filtered index
Filtered Index is a new
feature in SQL SERVER 2008. Filtered Index is used to index a portion of rows
in a table that means it applies filter on INDEX which improves query
performance, reduce index maintenance costs, and reduce index storage costs
compared with full-table indexes.
When we see an Index created with some WHERE
clause then that is actually a FILTERED INDEX.
For Example,
If we want to get the Employees whose Title is
“Marketing Manager”, for that let’s create an INDEX on EmployeeID whose
Title is “Marketing Manager” and then write the SQL Statement to retrieve
Employees who are “Marketing Manager”.
CREATE NONCLUSTERED INDEX
NCI_DepartmentON HumanResources.Employee(EmployeeID)WHERE Title= 'Marketing Manager'
Points to remember when creating Filtered
Index:
- They can be created
only as Nonclustered Index- They can be used on Views only if they are persisted views.
- They cannot be created on full-text Indexes.
Let us write simple SELECT statement on the table
where we created Filtered Index.
SELECT he.EmployeeID,he.LoginID,he.TitleFROM HumanResources.Employee heWHERE he.Title = 'Marketing Manager'
Now we will see the Execution Plan and compare
the performance before and after the Filtered Index was created on Employee
table.
As we can see, in first case the index scan in
100% done on Clustered Index taking 24% of total cost of execution. Once the
Filtered index was created on Employee table, the Index scan is 50% on
Clustered Index and 50% on Nonclustered Index which retrieves the data faster
taking 20% of total cost of execution compared to 24%
on table with no index.
If we have table with thousands of records and we
are only concern with very few rows in our query we should use Filtered Index.
Conclusion:
A
filtered Index is an optimized non clustered Index which is one of the great
performance improvements in SQL SERVER 2008 reducing the Index storage cost and
reduces maintenance cost.
No comments:
Post a Comment