25. Indexing: Clustered B-Tree Indexes in SQL Server are organized as B-trees member name clustered index (image from Clustered Indexes vs. Nonclustered Indexes in SQL Server:http://tr.im/AeU5)
26. Indexing: Non-Clustered B-Tree member id non-clustered index (image from Clustered Indexes vs. Nonclustered Indexes in SQL Server:http://tr.im/AeU5)
27. Indexing: Other Types Unique Full-text Included columns Indexed views XML Filtered (new for 2008) Spatial (new for 2008) http://msdn.microsoft.com/en-us/library/ms175049.aspx
30. Indexing considerations: tables Integer primary key on every table /* take checkpoint, clear buffers & cache */ SELECT s.term, s.section_id, COUNT(penn_id) FROM flat_section s JOIN flat_enrollment e ON s.section_id = e.section_id AND s.term = e.term GROUP BY s.term, s.section_id
33. Indexing considerations: columns Columns you join on: indexed integers are your friend! How are the columns used in queries? Cardinality: 1:1, 1:many, many:many Data type Indexing multiple columns: moderation Goal 1: performance! Goal 2: smallest index file possible.
34. Indexing Considerations: Yes! No!
35. Indexing Considerations: Yes! No! TINY: 8 bits (0 – 255): 01010101 SMALL INTEGER: 16 bits (0 – 65536): 0101010101010101 INTEGER: 32 bits (0 – 16777215): 01010101010101010101010101010101 VARCHAR ‘philadelphia’: 104 bits, at least (encoding UTF-8): 01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 Consider joining 4 tables on ‘philadelphia’: 4 initial lookups on indexes, 8 times as bulky and less cacheable as a small integer. Index on VARCHARs only when needed Keeps index files smaller and less chance of fragmentation; fragmented index files make Matt Frew’s life hellish (no, that is NOT a positive!) Consider purpose: don’t index for a one time script or report
36. Indexing Example: WRDS Queries
37. Indexing Example: WRDS Queries Large table: millions of rows A record for each WRDS query VARCHAR columns that should be INTEGERS Report requests for subscribers asking number of queries for a date range group by library and file Before indexing, full table scan: 30 secs per query Index added: subscriber, query date, library, file After indexing, without table scan: 0.02 secs per query
38. Indexing Tools: SSMS From the Query menu: SET STATISTICS TIME, SET STATISTICS IO Include Actual Execution Plan
42. Best Practices: Data Types Don’t skimp on column length: Yes/No? Maybe. Open/Closed? Under construction. Black/White? Grey. Know required level of precision, and leave yourself room to grow. Accuracy to the day, minute, millisecond?
44. Best Practices: work the DB Foreign Keys Unique indexes Check constraints Default constraints Triggers image courtesy of My New Filing Technique is Unstoppable by David Rees: http://www.mnftiu.cc/2002/11/26/filing-009/ (nsfw)
46. Best Practices: Crunch Time! “Temporary” projects Balance between today’s pragmatism and tomorrow’s pain Code review sooner
47. Best Practices: Experiment Experiment in SQL Server Management Studio to improve your times and execution plans
48. Be Opinionated! Solicit feedback on database design before coding starts, not after. Ask for opinions, and share your opinions! More eyes = better database design More ideas = better database design Anyone have any tips… or questions?
49. Resources SQL Server Books Online http://msdn.microsoft.com/en-us/library/ms130214.aspx SQL Server 2008 Query Performance Turning Distilled by Grant Fritchey and Sajal Dam Comparing Tables Organized with Clustered Indexes versus Heapshttp://technet.microsoft.com/en-us/library/cc917672.aspx MS Index Design Guidelineshttp://msdn.microsoft.com/en-us/library/ms191195.aspx Clustered Indexes vs. Nonclustered Indexes in SQL Serverhttp://digcode.com/default.aspx?page=ed51cde3-d979-4daf-afae-fa6192562ea9&article=443e9774-7d26-422d-a2f1-dbcafbb1e1fc&pc=5 SQL Server Execution Plans (free e-book, registration required)http://www.sqlservercentral.com/articles/books/65831/ Uncover Hidden Data to Optimize Application Performancehttp://msdn.microsoft.com/en-us/magazine/cc135978.aspx My New Filing Technique is Unstoppable (NSFW)http://www.mnftiu.cc/2002/11/26/filing-001/ SQL in the Wildhttp://sqlinthewild.co.za/ Journey to SQL Authority With Pinal Davehttp://blog.sqlauthority.com/