SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our User Agreement and Privacy Policy.
SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our Privacy Policy and User Agreement for details.
Successfully reported this slideshow.
Activate your 30 day free trial to unlock unlimited reading.
18.
Jennifer</li></li></ul><li> Naming Conventions<br />Pick one and enforce it: camelCase, PascalCase, under_scores<br />Why?<br />Cleaner code<br />Logical joins<br />Sanity of future developers and future you<br />Explicitly name constraints<br />Avoid keywords as column names<br />WRDS Fail: group, client, school, subscriber, and institution are all used for the same data entity<br />
20.
DB Normalization<br />The key, the whole key, and nothing but the key. <br />So help me Codd.<br />
21.
DB Normalization<br />http://en.wikipedia.org/wiki/File:Insertion_anomaly.svg<br />
22.
Why normalize?<br />Avoid data duplication<br />Let end users make their own changes<br />Avoid data anomalies<br />Third-party tools rely on normalized data<br />
23.
Indexing<br />Find a book in Van Pelt without a card catalog…<br />
25.
Indexing: Clustered B-Tree<br />Indexes in SQL Server are organized as B-trees<br />member name clustered index (image from Clustered Indexes vs. Nonclustered Indexes in SQL Server:http://tr.im/AeU5)<br />
26.
Indexing: Non-Clustered B-Tree<br />member id non-clustered index (image from Clustered Indexes vs. Nonclustered Indexes in SQL Server:http://tr.im/AeU5)<br />
27.
Indexing: Other Types<br />Unique<br />Full-text<br />Included columns<br />Indexed views<br />XML<br />Filtered (new for 2008)<br />Spatial (new for 2008)<br />http://msdn.microsoft.com/en-us/library/ms175049.aspx<br />
28.
Indexing: Primary Keys<br />Primary key = unique index (clustered or non-clustered)<br />
29.
Indexing considerations: tables<br /><ul><li>Clustered index on every table</li></ul>member name non-clustered index (image from Clustered Indexes vs. Nonclustered Indexes in SQL Server:http://tr.im/AeU5)<br />
30.
Indexing considerations: tables<br />Integer primary key on every table<br />/* take checkpoint, clear buffers & cache */<br />SELECT s.term, s.section_id, COUNT(penn_id)<br />FROM flat_section s JOIN flat_enrollment e<br />ON s.section_id = e.section_id<br />AND s.term = e.term<br />GROUP BY s.term, s.section_id<br />
33.
Indexing considerations: columns<br />Columns you join on: indexed integers are your friend!<br />How are the columns used in queries?<br />Cardinality: 1:1, 1:many, many:many<br />Data type<br />Indexing multiple columns: moderation<br />Goal 1: performance!<br />Goal 2: smallest index file possible.<br />
35.
Indexing Considerations: Yes! No!<br />TINY: 8 bits (0 – 255): 01010101<br />SMALL INTEGER: 16 bits (0 – 65536): 0101010101010101<br />INTEGER: 32 bits (0 – 16777215): 01010101010101010101010101010101<br />VARCHAR ‘philadelphia’: 104 bits, at least (encoding UTF-8): 01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101<br />Consider joining 4 tables on ‘philadelphia’: 4 initial lookups on indexes, 8 times as bulky and less cacheable as a small integer.<br />Index on VARCHARs only when needed<br />Keeps index files smaller and less chance of fragmentation; fragmented index files make Matt Frew’s life hellish (no, that is NOT a positive!)<br />Consider purpose: don’t index for a one time script or report<br />
37.
Indexing Example: WRDS Queries<br />Large table: millions of rows<br />A record for each WRDS query<br />VARCHAR columns that should be INTEGERS<br />Report requests for subscribers asking number of queries for a date range group by library and file<br />Before indexing, full table scan: 30 secs per query<br />Index added: subscriber, query date, library, file<br />After indexing, without table scan: 0.02 secs per query<br />
38.
Indexing Tools: SSMS<br />From the Query menu:<br />SET STATISTICS TIME, SET STATISTICS IO<br />Include Actual Execution Plan<br />
41.
Best Practices: Blame!<br />Blame the SQL Admins!<br />
42.
Best Practices: Data Types<br />Don’t skimp on column length: Yes/No? Maybe. Open/Closed? Under construction. Black/White? Grey.<br />Know required level of precision, and leave yourself room to grow.<br />Accuracy to the day, minute, millisecond?<br />
43.
Best Practices: Deletion<br />Logical deletes vs. physical deletes<br />
44.
Best Practices: work the DB<br />Foreign Keys<br />Unique indexes<br />Check constraints<br />Default constraints<br />Triggers<br />image courtesy of My New Filing Technique is Unstoppable by David Rees: http://www.mnftiu.cc/2002/11/26/filing-009/ (nsfw)<br />
46.
Best Practices: Crunch Time!<br />“Temporary” projects<br />Balance between today’s pragmatism and tomorrow’s pain<br />Code review sooner<br />
47.
Best Practices: Experiment<br />Experiment in SQL Server Management Studio to improve your times and execution plans<br />
48.
Be Opinionated!<br />Solicit feedback on database design before coding starts, not after.<br />Ask for opinions, and share your opinions!<br />More eyes = better database design<br />More ideas = better database design<br />Anyone have any tips… or questions?<br />
49.
Resources<br />SQL Server Books Online http://msdn.microsoft.com/en-us/library/ms130214.aspx<br />SQL Server 2008 Query Performance Turning Distilled by Grant Fritchey and Sajal Dam<br />Comparing Tables Organized with Clustered Indexes versus Heapshttp://technet.microsoft.com/en-us/library/cc917672.aspx<br />MS Index Design Guidelineshttp://msdn.microsoft.com/en-us/library/ms191195.aspx<br />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<br />SQL Server Execution Plans (free e-book, registration required)http://www.sqlservercentral.com/articles/books/65831/<br />Uncover Hidden Data to Optimize Application Performancehttp://msdn.microsoft.com/en-us/magazine/cc135978.aspx<br />My New Filing Technique is Unstoppable (NSFW)http://www.mnftiu.cc/2002/11/26/filing-001/<br />SQL in the Wildhttp://sqlinthewild.co.za/<br />Journey to SQL Authority With Pinal Davehttp://blog.sqlauthority.com/<br />