Speakers Corner Event at Ciklum Dnepropetrovsk Office. Alexander Korotkiy, Senior .NET Developer talking Indexes in MS SQL Server.Speakers Corner Event at Ciklum Dnepropetrovsk Office. Alexander Korotkiy, Senior .NET Developer talking Indexes in MS SQL Server.
7. CREATE INDEX (T-SQL)
<relational_index_option> ::=
{
PAD_INDEX = { ON | OFF }
| FILLFACTOR = fillfactor
| SORT_IN_TEMPDB = { ON | OFF }
| IGNORE_DUP_KEY = { ON | OFF }
| STATISTICS_NORECOMPUTE = { ON | OFF }
| DROP_EXISTING = { ON | OFF }
| ONLINE = { ON | OFF }
| ALLOW_ROW_LOCKS = { ON | OFF }
| ALLOW_PAGE_LOCKS = { ON | OFF }
| MAXDOP = max_degree_of_parallelism
| DATA_COMPRESSION = { NONE | ROW | PAGE}
[ ON PARTITIONS ( { <partition_number_expression> | <range> }
[ , ...n ] ) ]
}
7
8. Useful tips
Consider using a clustered index for queries that do the following:
!
•
•
•
•
Return a range of values by using operators such as BETWEEN, >, >=, <, and <=.
Return large result sets.
Use JOIN clauses; typically these are foreign key columns.
Use ORDER BY, or GROUP BY clauses.
•
•
•
•
Are unique or contain many distinct values
Are accessed sequentially
Defined as IDENTITY because the column is guaranteed to be unique within the table.
Used frequently to sort the data retrieved from a table.
•
•
Columns that undergo frequent changes
Wide keys
!
Consider columns that have one or more of the following attributes:
!
!
Clustered indexes are not a good choice for the following attributes:
!
8
9. Useful tips
Consider the characteristics of the database when designing nonclustered indexes.
!
• Databases or tables with low update requirements, but large volumes of data can benefit
from many nonclustered indexes to improve query performance. Consider creating filtered
indexes for well-defined subsets of data to improve query performance, reduce index storage
costs, and reduce index maintenance costs compared with full-table nonclustered indexes.
• Online Transaction Processing applications and databases that contain heavily updated
tables should avoid over-indexing. Additionally, indexes should be narrow, that is, with as few
columns as possible.
!
Consider using a nonclustered index for queries that have the following attributes:
!
• Use JOIN or GROUP BY clauses.
• Queries that do not return large result sets.
• Contain columns frequently involved in search conditions of a query, such as WHERE clause,
that return exact matches.
!
Consider columns that have one or more of these attributes:
!
• Cover the query.
• Lots of distinct values, such as a combination of last name and first name, if a clustered index
is used for other columns.
9
10. Useful tips
Query in which the
column predicate is
one of these
Exact match to a specific
value
Query description and example
Index to consider
Searches for an exact match in which the query uses the WHERE
Nonclustered or
clause to specify a column entry with a specific value. For example: clustered index on the
Id column.
! Id, [Login], Email FROM Users WHERE Id = 202
SELECT
Searches for an exact match to a value in a specified list of values.
Exact match to a value in an For example:
IN (x,y,z) list
! Id, [Login], Email FROM Users WHERE Id IN (603, 658, 1371)
SELECT
Nonclustered or
clustered index on the
Id column.
Searches for a range of values in which the query specifies any entry
that has a value between two values. For example:
Range of values
! Id, UserId, CreateDate, Content FROM Posts WHERE CreateDate
SELECT
>= '2013-03-01 12:00' AND CreateDate <= '2013-03-01 12:30‘
!
Or
! Id, UserId, CreateDate, Content FROM Posts WHERE CreateDate
SELECT
Clustered or
nonclustered index on
the CreateDate column.
BETWEEN '2013-03-01 12:00' AND '2013-03-01 12:30'
Join between tables
Searches for rows in a table that match a row in another table based
Nonclustered or
on a join predicate. For example:
clustered index on the
Id and UserId columns.
SELECT u.Id, u.[Login], p.Content
!
FROM Users u JOIN Posts p ON u.Id = p.UserId WHERE u.Id = 202
10
11. Useful tips
Query in which the
column predicate is
one of these
LIKE comparison
Sorted or aggregated
PRIMARY KEY or UNIQUE
constraint
Query description and example
Searches for matching rows that start with a specific character
string such as 'abc%'. For example:
! Id, [Login], Email FROM Users WHERE [Login] LIKE 'ma%'
SELECT
Nonclustered or
clustered index on the
Login column.
Nonclustered or
Requires an implicit or explicit sort order or an aggregation (GROUP clustered index on the
BY). For example:
sorted or aggregated
column.
SELECT p.Id, p.UserId, u.[Login], p.Content
For sort columns,
FROM Posts p JOIN Users u ON p.UserId = u.Id
consider specifying the
ORDER BY p.UserId, p.CreateDate
ASC or DESC order of
Searches for duplicates of new index key values in insert and update Clustered or
operations, to enforce PRIMARY KEY and UNIQUE constraints. For
nonclustered index on
example:
the column or columns
!
! Users ([Login], [Password], Email)
INSERT
VALUES ('xdfyht', 'dh4G57hn1', 'xdfyht@gmail.com')
UPDATE or DELETE operation Searches for rows in an update or delete operation in which the
in a PRIMARY KEY/FOREIGN column participates in a PRIMARY KEY/FOREIGN KEY relationship,
KEY relationship
with or without the CASCADE option.
Contains one or more columns in the select list that are not used for
searching and lookups. For example:
Column is in the select list
but not in the predicate.
Index to consider
! UserId, CreateDate, Content FROM Posts
SELECT
WHERE UserId = 202 ORDER BY CreateDate DESC
defined in the
constraint.
Nonclustered or
clustered index on the
foreign key column.
Nonclustered index with
Content specified in the
INCLUDE clause.
11
14. Index options (filtered)
Views vs. Filtered Indexes
Allowed in expressions
Views
Filtered indexes
Computed columns
Yes
No
Joins
Yes
No
Multiple tables
Yes
No
Simple comparison logic in a predicate
Yes
Yes
Complex logic in a predicate
Yes
No
14