"Using Indexes in SQL Server 2008" by Alexander Korotkiy, part 1
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

"Using Indexes in SQL Server 2008" by Alexander Korotkiy, part 1

on

  • 571 views

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 ...

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.

Statistics

Views

Total Views
571
Views on SlideShare
571
Embed Views
0

Actions

Likes
0
Downloads
14
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

"Using Indexes in SQL Server 2008" by Alexander Korotkiy, part 1 Presentation Transcript

  • 1. Using indexes Index architecture clustered nonclustered CREATE INDEX (T-SQL) Useful tips Index options Spatial indexes 1
  • 2. Index architecture 2
  • 3. Index architecture 3
  • 4. Index architecture (clustered) 4
  • 5. Index architecture (nonclustered) 5
  • 6. CREATE INDEX (T-SQL) CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name ON <object> ( column [ ASC | DESC ] [ ,...n ] ) [ INCLUDE ( column_name [ ,...n ] ) ] [ WHERE <filter_predicate> ] [ WITH ( <relational_index_option> [ ,...n ] ) ] [ ON { partition_scheme_name ( column_name ) | filegroup_name | default } ] [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ] ! [;] 6
  • 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
  • 12. Index options (fill factor) 12
  • 13. Index options (included columns) 13
  • 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
  • 15. Spatial indexes 15
  • 16. Spatial indexes 16
  • 17. Spatial indexes 17
  • 18. Spatial indexes 18
  • 19. Spatial indexes (conditions) • • • • • • • • geometry1.STContains(geometry2) = 1 geometry1.STDistance(geometry2) < @r geometry1.STDistance(geometry2) <= @r geometry1.STEquals(geometry2) = 1 geometry1.STIntersects(geometry2) = 1 geometry1.STOverlaps(geometry2) = 1 geometry1.STTouches(geometry2) = 1 geometry1.STWithin(geometry2) = 1 • • • • geography1.STEquals(geography2) = 1 geography1.STDistance(geography2) < @r geography1.STDistance(geography2) <= @r geography1.STIntersects(geography2) = 1 19
  • 20. about:me http:// unknowntransfer.blogspot.com akor@ciklum.com Skype: unknowntransfer 20