You are on page 1of 36

SQL Server Performance Tuning

Introduction for Developers Dmitry Frenkel Perot Systems Corporation Péradigm Solutions Development

People. Processes. Technology. Results.

www.perotsystems.com

Copyright © 2005 Perot Systems. All rights reserved. All trademarks are the property of their respective owners.

1

Overview
SQL Server Performance Tuning This Guide ‡ ‡ ‡ Knowing how to optimize SQL Server performance is essential skill for a developer This presentation will help developers to better understand SQL Server internals This presentation will introduce simple techniques that help in improving SQL performance

www.perotsystems.com

Copyright © 2005 Perot Systems. All rights reserved. All trademarks are the property of their respective owners.

2

Introduction
SQL Server Performance Tuning ‡ ‡ ‡ ‡ ‡ How Queries are Executed Stored Procedure vs. Raw SQL Common causes of poor SQL Server performance Focus: Query Optimization Optimization Process

www.perotsystems.com

Copyright © 2005 Perot Systems. All rights reserved. All trademarks are the property of their respective owners.

3

operators. expressions. 4 . Perform simple syntax-based optimizations. All rights reserved. perform full cost-based optimization. Raw SQL Common causes of poor SQL Server performance Focus: Query Optimization Optimization Process Break SQL into logical units such as keywords. and identifiers. All trademarks are the property of their respective owners.perotsystems. Produce sequence tree SQL Execute Parse SQL Statement Normalize Execution Tree Optimize SQL Query Cache Execution Plan Allocate Memory Execute Return Data Binding: verify that the tables and columns exist and load the metadata for the tables and columns. Perform Trivial Optimization.How Queries are Executed SQL Server Performance Tuning ad SQL Query Execution Introduction ‡ ‡ ‡ ‡ ‡ How Queries are Executed Stored Procedures vs. Perform more syntactical transformations. If needed.com Copyright © 2005 Perot Systems. Replace views with definitions. Execution Plan is produced here www. Perform implicit data conversions (typecasting).

tss?thread_id=31953 ‡ ‡ ‡ www. All rights reserved. Raw SQL SQL Server Performance Tuning ‡ Introduction ‡ ‡ ‡ ‡ ‡ How Queries are Executed Stored Procedures vs.theserverside. 5 .com Copyright © 2005 Perot Systems. Raw SQL Common causes of poor SQL Server performance Focus: Query Optimization Optimization Process Stored Procedure ± Execution plan is cached ± Better security isolation (ownership link concept) ± No way to inject SQL (unless dynamic SQL is used inside) ± Architecture consideration .perotsystems. All trademarks are the property of their respective owners.Protected variation ± May be negatively affected by parameter sniffing ± Needs to be recompiled from time to time as data changes Raw SQL ± Compiled every time (more memory in procedure cache) ± No security isolation (permission have to be explicitly granted for every object) ± Sometimes possible to inject SQL ± Architecture consideration ± Affected by change Microsoft recommended best practice is to use stored procedures Topic of heated debate in software development community ± http://www.net/news/thread.Stored Procedure vs.

Common Causes of poor SQL Performance SQL Server Performance Tuning Introduction ‡ ‡ ‡ ‡ How Queries are Executed Common causes of poor SQL Server performance Focus: Query Optimization Optimization Process ‡ ‡ ‡ ‡ Poorly written queries and database schema Inadequate disk performance Memory pressure leading to low page life expectancy Long running queries (blocking and locking) www. All rights reserved.com Copyright © 2005 Perot Systems. All trademarks are the property of their respective owners.perotsystems. 6 .

com Copyright © 2005 Perot Systems. All rights reserved. 7 .Focus: Query Optimization SQL Server Performance Tuning ‡ Introduction ‡ ‡ ‡ ‡ How Queries are Executed Common causes of poor SQL Server performance Focus: Query Optimization Optimization Process Execution plans and cost-based optimizations Optimization phases SARG-able clauses Indices and Distribution statistics Join Selection Execution plan notation Techniques and Demos Inside SQL Server 2000 ± Chapters 15 and 16 ‡ ‡ ‡ ‡ ‡ ‡ ‡ www.perotsystems. All trademarks are the property of their respective owners.

perotsystems.com Copyright © 2005 Perot Systems.Execution Plan Is« SQL Server Performance Tuning ‡ Introduction ‡ ‡ ‡ ‡ How Queries are Executed Common causes of poor SQL Server performance Focus: Query Optimization Optimization Process Most important step in query execution is generation of an optimal execution plan. Strategy determined by SQL Query Optimizer ± Can be influenced by developers Key Decisions are made: ± Which indexes to use? ± How to perform JOIN operations? ± How to order and group data? ± In what order tables should be processed? ± If cached data and previously compiled plans can be reused? Cost-based Decision Tree Extremely fast Uses advanced graph theory and pruning techniques. All rights reserved. ‡ ‡ ‡ ‡ ‡ www. All trademarks are the property of their respective owners. 8 .

perotsystems. All rights reserved. All trademarks are the property of their respective owners.com Copyright © 2005 Perot Systems. one at a time Thorough testing Measurement under load ± Measuring from Query Analyzer is not good enough ± Multithreaded Database Load Testing Tool written by Perot team ± Successfully piloted on large projects Proactive monitoring ± Work with DBA team to establish proper tracing and performance monitors and alerts ± Analyze data periodically ‡ ‡ ‡ ‡ www.Our Role in Optimization Process SQL Server Performance Tuning ‡ Introduction ‡ ‡ ‡ ‡ How Queries are Executed Common causes of poor SQL Server performance Focus: Query Optimization Optimization Process Apply iterative process of changing queries and database objects so that SQL Query Optimizer can make better decisions and do it faster Identify plan deficiencies and make changes . 9 .

Please notice that subsequent iterations of Analyze Potential Problems may include analysis of [No] solutions developed in a previous iteration(s). not just the original problems highlighted by low performance metric. All trademarks are the property of their respective owners. 10 .com Copyright © 2005 Perot Systems.Optimization Process Spiral ad Performance Improv ements SQL Server Performance Tuning Introduction ‡ ‡ ‡ ‡ How Queries are Executed Common causes of poor SQL Server performance Focus: Query Optimization Optimization Process Change One Thing and Remeasure Loop.perotsystems. QoS Ticket Received Performance Review Obtain Performance Metrics [Yes] Metrics Meet Requirements? [No] No Negative Trends Observed? [No] Analyze Potential Problems Obtain Additional Metrics Measure Performance Gain Design and Prototype Solution Satisfactory Performance Increase? [Yes] [Yes] Implement Solution Schedule Next Rev iew www. All rights reserved.

        ¨ © ¨ § ¦¥¤£¡ ¢¡   o Phase Trvial Plan Optimization o Phase 2 Syntactical Transformation Phase SA ull Optimization Analysis Phase ull Optimization Inde Selection Phase ull Optimization oin Strategy Selection 11 .Inside SQL Server Query Optimization SQL Server Performance Tuning ad p imi a ion Introduction ‡ ‡ ‡ ‡ How Queries are ecuted Optim SQL Query ize Common causes of poor SQL Server performance ocus Query Optimization Optimization Process Plan found in cache Is Plan Cheap nough   es es ecution P Selected lan www.perotsystems.com Copyright © 2005 Perot Systems. All trademarks are the property of their respective owners. All rights reserved.

Full Optimization Steps SQL Server Performance Tuning ‡ Introduction ‡ ‡ ‡ ‡ How Queries are Executed Common causes of poor SQL Server performance Focus: Query Optimization Optimization Process SARG Analysis Index Selection Join Strategy Selection ‡ ‡ www.com Copyright © 2005 Perot Systems.perotsystems. 12 . All rights reserved. All trademarks are the property of their respective owners.

13 . All rights reserved. SET SHOWPLAN_TEXT ± Ctrl+L in Query Analyzer (Query->Display Estimated Execution Plan) ± Ctrl+K in Query Analyzer (Query->Show Execution Plan) Books Online contains detailed documentation on Execution Plan notation (search for ³Query Window Execution Plan Pane³ ) Buono.Execution Plan Notation SQL Server Performance Tuning ‡ Graphic mode or Text Mode ± SET SHOWPLAN_ALL. il cattivo (The Good. All trademarks are the property of their respective owners. the Ugly.perotsystems.com Copyright © 2005 Perot Systems. il brutto. the Bad) ± Table Scans and Index Scans ± Bad and Ugly ± Sorts ± generally Bad and Ugly ± Hash Joins ± Bad and Ugly ± Thick lines coming into the operation and thin lines coming out ± Bad and Ugly ± Merge Joins ± Good without big sort ± ± ± ‡ Index Seeks and Clustered Index Seeks ± Good Nested Loop Joins ± Good Bookmark Lookups ± ³it depends´ (see below) ‡ ‡ Demo: Execution Plans Demo www.

perotsystems. density and I/O cost) ± Indices for JOIN Conditions ± Indices for GROUP BY ± Forcing index using hints ± Bookmark Lookups and Covering Indices ± Over-indexing and INSERT performance ± Denormalization Other techniques ± Application caching ± Updates in blocks ± Avoiding negative effects of Parameter Sniffing ‡ ‡ www. All trademarks are the property of their respective owners. All rights reserved.com Copyright © 2005 Perot Systems.Optimization Techniques SQL Server Performance Tuning ‡ Optimizing SQL clauses ± SARG-able Where Clauses ± Avoiding Implicit CONVERT ± Avoiding unnecessary ORDER BY Optimizing Database Schema ± Indices and Statistics ± Choosing Useful Indices (selectivity. 14 .

NOT IN.SARG-able Where Clauses SQL Server Performance Tuning ‡ Optimization Techniques ‡ Optimizing SQL clauses ± SARG-able where clauses Optimizing Database Schema Other techniques Creating SARG-able Where clauses is one of the most important parts of performance tuning SARG = Searcheable ARGument Limits search because it specifies an exact match or a range of values. >. =>. All trademarks are the property of their respective owners. SARG AND SARG is a SARG SARG OR SARG may or may not be a SARG (depending on indices) SARG-able operators include =. <>. and sometimes LIKE. <.com Copyright © 2005 Perot Systems. All rights reserved.perotsystems. Function calls are non SARG-able NOT. 15 . !=. BETWEEN. NOT EXISTS. and NOT LIKE are typically not SARG-able If a column appears on both sides of the operator. the clause is not SARG-able ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ www. <=.

All trademarks are the property of their respective owners.SARG-able Where Clauses .sql SARG Demo Without Matching Index.Demo SQL Server Performance Tuning SARG Demo: Optimization Techniques ‡ Optimizing SQL clauses ± SARG-able where clauses Optimizing Database Schema Other techniques SARG Demo.com Copyright © 2005 Perot Systems.perotsystems.sql SARG Demo Non-SARGable Part. 16 .sql ‡ ‡ www. All rights reserved.sql SARG Demo with LIKE.sql SARG Demo With Multiple Indices.

All trademarks are the property of their respective owners. 17 .perotsystems.SARG-able Where Clauses SQL Server Performance Tuning Summary Optimization Techniques ‡ Optimizing SQL clauses ± SARG-able where clauses Optimizing Database Schema Other techniques ‡ ‡ ‡ Try to make biggest filtering clause SARG-able Cover it with a useful index (see discussion on indices later) Using a non SARG-able clause does not always results in a table scan ‡ ‡ www.com Copyright © 2005 Perot Systems. All rights reserved.

All rights reserved.sql ‡ ‡ ‡ ‡ ‡ www.perotsystems. All trademarks are the property of their respective owners. 18 .Avoiding Implicit CONVERT SQL Server Performance Tuning ‡ Optimization Techniques ‡ Optimizing SQL clauses ± Avoiding Implicit CONVERT Optimizing Database Schema Other techniques Occurs when different data types are compared Slows down query execution and requires more resources thus increasing execution cost Should be eliminated by adjusting data types of parameters Demo: CONVERT Demo.com Copyright © 2005 Perot Systems.

All rights reserved.com Copyright © 2005 Perot Systems. 19 . sorting happens in memory and tempdb Generally speaking. All trademarks are the property of their respective owners. ORDER BY clauses should be avoided No ORDER BY to sort on UI Demo: ORDER BY Demo.sql ‡ ‡ www.Avoiding Unnecessary ORDER BY SQL Server Performance Tuning Optimization Techniques ‡ Optimizing SQL clauses ± Avoiding unnecessary ORDER BY Optimizing Database Schema Other techniques ‡ ‡ ‡ ‡ ‡ ‡ ORDER BY clause causes SQL Server to sort result set SQL Server tries to use indexes to perform sorting If it can¶t.perotsystems.

Indices and Statistics SQL Server Performance Tuning Optimization Techniques ‡ ‡ Optimizing SQL clauses Optimizing Database Schema ± Indices and Statistics Other techniques ‡ ‡ ‡ ‡ ‡ ‡ ‡ Index in SQL Server is a B-Tree structure storing key values Distribution statistics for an index is a histogram of record counts between keys Statistics play vital role in index selection that occurs during query optimization Statistics are used to estimate I/O cost of the index use I/O Cost is expressed in number of logical page reads needed to retrieve data Logical translates into a physical read if required page is not yet available in memory cache If I/O Cost of an index is too high. All trademarks are the property of their respective owners. 20 . All rights reserved. SQL Server will ignore it ‡ www.com Copyright © 2005 Perot Systems.perotsystems.

perotsystems. All rights reserved.com Copyright © 2005 Perot Systems.Clustered vs. All trademarks are the property of their respective owners.sql ‡ ‡ ‡ ‡ ‡ www. Non-Clustered Indices SQL Server Performance Tuning Optimization Techniques ‡ ‡ Optimizing SQL clauses Optimizing Database Schema ± Indices and Statistics Other techniques ‡ ‡ Similar upper levels of the B-tree ( value + pointer to children pages) Different leaf level: ± Non-clustered index contains value + pointer to the data page ± Clustered index contains data page itself! As soon as clustered index is created: ± Table pages are physically rearranged and resorted to fit B-tree ± All non-clustered indexes are changed ± page reference is replaced with clustered index value for leaf pages Because data pages are rearranged. 21 . only one clustered index can exists for a table Every non-clustered index contains clustered index values at the leaf level Demo: CLUSTERED Index Demo.

10 or lower ± Filter out 90% or more data for a given set of keys Pick indices that match your access patterns ± Identify most commonly used SARG-able conditions and cover them with an index ± Identify large GROUP BY things and cover them too Demo: USELESS Index Demo.Choosing Useful Indices SQL Server Performance Tuning Optimization Techniques ‡ ‡ Optimizing SQL clauses Optimizing Database Schema ± Choosing Useful Indices Other techniques ‡ ‡ ‡ ‡ ‡ ‡ I/O cost is less then I/O cost of a table scan Highly selective Selectivity is a measure opposite to density Density = 1/Number of unique values that exist in the index data Highly selective indexes have density values of 0. All rights reserved. 22 .sql DBCC SHOW_STATISTICS(µTable Name'.perotsystems.com Copyright © 2005 Perot Systems. All trademarks are the property of their respective owners. µIndex Name') ‡ ‡ ‡ www.

Extremely effective ± Merge joins are used when both inputs are roughly the same size. All trademarks are the property of their respective owners. 23 . Requires presorted data and therefore can be dangerous ± Hash joins are used to process un-sorted data using in-memory hashing ± generally the slowest way Primary Keys.perotsystems.com Copyright © 2005 Perot Systems. Foreign Key does not create an index! Creating index that covers join condition can help SQL Server to avoid hash join Best case scenario: index used for SARG-able clause can also be used for join Inside SQL Server: Chapter 16 is your friend! Demo: JOIN Demo.sql ‡ ‡ ‡ ‡ ‡ ‡ ‡ www.Indices for JOIN Conditions SQL Server Performance Tuning Optimization Techniques ‡ ‡ Optimizing SQL clauses Optimizing Database Schema ± Indices for JOIN conditions Other techniques ‡ ‡ Tables to be joined (or subsets have already been restricted with conditions in the WHERE clause) are called the join inputs Tree types of joins ± Nested loops are used when one of the inputs is smaller then other. All rights reserved. Foreign Keys and UNIQUE constraints are most commonly used for joins In SQL Server.

All rights reserved. 24 . All trademarks are the property of their respective owners.sql ‡ ‡ ‡ www.Indices For GROUP BY SQL Server Performance Tuning Optimization Techniques ‡ ‡ Optimizing SQL clauses Optimizing Database Schema ± Indices for GROUP BY Other techniques ‡ Execution Plan: Hash Match vs.com Copyright © 2005 Perot Systems. Stream Aggregation ± Hash Match is similar to Hash Join ± Stream Aggregation requires input to be sorted by the columns forming GROUP BY ± Generally speaking.perotsystems. Stream Aggregation is faster ± Hints: HASH GROUP and ORDER GROUP Try to cover GROUP BY columns with an index to avoid hash match on large datasets Demo: GROUP BY Demo.

Forcing Indices Using Hints SQL Server Performance Tuning Optimization Techniques ‡ ‡ Optimizing SQL clauses Optimizing Database Schema ± Forcing Indices Using Hints Other techniques ‡ ‡ « FROM table_name WITH (INDEX (index_name) [. . All trademarks are the property of their respective owners.perotsystems.com Copyright © 2005 Perot Systems. 25 .. be sure to do the following: ± Update statistics ± Recompile procedure (see parameters sniffing section) Hinted query/stored procedure needs to be monitored and watched Sometimes SQL Server will ignore hints if it¶s obvious to the optimizer that there is a better way to execute a query ± That¶s why they are called HINTS.]) Can use Index ID instead of Index Name ± Be careful ± index ID change as you drop and create new indices ± Index ID of 0 will force a table scan Typically used when SARG-able index is different from JOIN index and SQL Server makes wrong decision ± May occur in complex queries Should be used with extreme caution and tested under load Before you decide to use hints.. not ORDERS Case study: ³CasesAssignedTo´ stored procedure ‡ ‡ ‡ ‡ ‡ ‡ ‡ www. All rights reserved.

All rights reserved.Bookmark Lookups and Covering Indices SQL Server Performance Tuning Optimization Techniques ‡ ‡ Optimizing SQL clauses Optimizing Database Schema ± Bookmark Lookups and Covering Indices Other techniques ‡ Bookmark Lookup is retrieving full set of columns specified by SELECT using a bookmark (row ID or clustered key value) found in an index Occurs when SELECT contains more columns then index covers ± One of the reasons why SELECT * is bad ± don¶t return more data then you need Demo: BOOKMARK Lookup Demo.com Copyright © 2005 Perot Systems. All trademarks are the property of their respective owners.perotsystems.sql Bookmark Lookups are not always bad ± If query executes fast under load. 26 . who cares? ± Eliminate table scans and not SARG-able WHERE clauses first ± Turn to covering indices only when query is slow and bookmark lookup carries large percentage of the cost ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ www.sql Could carry high I/O cost Can be avoided by creating covering index ± Index that COVERS all columns used in SELECT clause ± Don¶t include clustered index columns in a covering index ± these values are already included Covering index will almost always be used by Query Optimizer ± Will not be used if another index seek is cheaper even counting cost of the bookmark lookup Demo: COVERING Index Demo.

index also changes ± B-Tree needs to be rebuilt ± Affects INSERT and UPDATE performance ± Take up space Avoid creating ³wide´ indices (multiple columns) ± Same reasons Best approach: ± Create indices that cover SARG-able WHERE clauses and JOINS (hopefully.Over-Indexing SQL Server Performance Tuning ‡ Optimization Techniques ‡ ‡ Optimizing SQL clauses Optimizing Database Schema ± Over-Indexing Other techniques Avoid creating too many indices ± Every time data changes. those are the same) ± Test your application under load ± Extend existing indices to become covering only for the queries that are slow and bookmark lookup carries most of the cost ± Do not create separate covering indices ‡ ‡ ‡ www.perotsystems. 27 . All rights reserved.com Copyright © 2005 Perot Systems. All trademarks are the property of their respective owners.

implementation does (protected variation) ± In some cases. 28 . All rights reserved. changes are limited to database layer! Case studies ± eCARE: Facility ID on Visits and Microbiology Tests ± eCARE: Visits Summary table ‡ ‡ www.perotsystems.com Copyright © 2005 Perot Systems.Denormalization SQL Server Performance Tuning ‡ Optimization Techniques ‡ ‡ Optimizing SQL clauses Optimizing Database Schema ± Denormalization Other techniques ‡ Deliberate violation of normal forms for the sake of performance ± Normally done to avoid additional join and/or make WHERE clause SARG-able ± Should not be done ³just in case´ ± Carries a penalty in maintaining data consistency ± Higher probability of regressing a bug ± Testing becomes very important Using stored procedures helps maintain data integrity ± Interface does not change. All trademarks are the property of their respective owners.

All rights reserved.NET ± Session ± Both ASP. can significantly improve performance ± One database server.NET and Windows Applications ± Cache ± Custom caching mechanisms Other design considerations ± Increased memory usage ± Notification when cached data changes at the source ± Thread protection ‡ ‡ ‡ www. All trademarks are the property of their respective owners.perotsystems. many application servers ± Database becomes a bottleneck What can be cached: ± Data that changes very infrequently ± Data that is expected to be used again shortly after it¶s been retrieved for the first time What can be used to cache data: ± ASP. 29 .com Copyright © 2005 Perot Systems.Caching Data In the Application SQL Server Performance Tuning Optimization Techniques ‡ ‡ ‡ Optimizing SQL clauses Optimizing Database Schema Other techniques ± Caching Data In the Application ‡ ‡ ‡ Technique of keeping data in memory Reduces number of hits on the database For most systems.

All rights reserved. All trademarks are the property of their respective owners.perotsystems.sql Pros ± Shortens transaction duration ± Reduces log file growth ± Improves locking situation by aviding lock escalation from occurring Cons ± No transactional contexts for the entire operation ± What to do if one of the ³blocks´ fails? ± Custom ³rollback´ mechanism Technique work nicely for conversions and batch jobs ‡ ‡ ‡ ‡ www. @@ROWCOUNT and TOP ± Keep batch size to less then 50.000 records to avoid lock escalation Demos: DELETES In Blocks USING TOP.Updates In Blocks SQL Server Performance Tuning ‡ Optimization Techniques ‡ ‡ ‡ Optimizing SQL clauses Optimizing Database Schema Other techniques ± Updates in Blocks Bulky update/delete operations can be broken in smaller ³blocks´ ± Using ROWCOUNT. 30 .com Copyright © 2005 Perot Systems.

31 .sql Cure 2: Create separate store procedure optimized for atypical parameter set ± Demo: eCARE Patient Search Know your data Test your stored procedures with atypical parameters When you deploy the stored procedure.Avoiding Parameter Sniffing SQL Server Performance Tuning ‡ Optimization Techniques ‡ ‡ ‡ Optimizing SQL clauses Optimizing Database Schema Other techniques ± Avoiding Parameter Sniffing Symptom: Procedure executes slower then the query it contains Affects systems with abnormal data distribution Affects STORED PROCEDURES and SP_Execute calls Demo: PARAMETER Sniffing Demo.com Copyright © 2005 Perot Systems. consider executing it once with typical set of parameters ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ www. All trademarks are the property of their respective owners. All rights reserved.perotsystems.Using Local Variables.sql Cure 1: Reassign SP parameters to local variables and use them in the SP ± May not help because execution plan will be ³averaged´ ± Demo: PARAMETER Sniffing Demo .

SQL Profiler SQL Server Performance Tuning ‡ ‡ ‡ Included into SQL Server Advanced monitoring tool Captures events occurring in the database ± Logins and logouts ± Transactions. 32 . completion times ± Recompilation attempts ± Locks and deadlocks ± Other events Running trace causes performance degradation ± Severity depending on the number of events that are captured ‡ www.com Copyright © 2005 Perot Systems. All rights reserved. All trademarks are the property of their respective owners. statements.perotsystems.

Advanced Topics SQL Server Performance Tuning ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ Locking and Blocking Waits and Queues Methodology Locks vs.com Copyright © 2005 Perot Systems. All trademarks are the property of their respective owners.perotsystems. 33 . Latches Hotspots Attentions Deadlocks Stored Procedure Recompiles Using SQL Profiler Excellent SQL Server Performance Tuning Workshop ± contact your Microsoft Liaison ± Extremely informative ± Fast-pace ± Useful for both DBAs and experienced developers ± Not a beginner-level class www. All rights reserved.

All rights reserved.com Copyright © 2005 Perot Systems.Conclusion SQL Server Performance Tuning What we have covered: ‡ ‡ ‡ ‡ Internals of SQL Server Engine Query Execution Plans Indexes and Statistics Performance Improvement Techniques ± Re-write SQL statements ± Changes to the Database Schema www.perotsystems. All trademarks are the property of their respective owners. 34 .

ISBN 0-7356-0998-5 Microsoft Workshop: SQL Server Performance Tuning Microsoft Patterns and Practices: Improving . 2001.com http://searchsqlserver.sqlservercentral.techtarget.perotsystems.sql-server-performance. 35 .com/SQLServer/ www. Microsoft Press.com Copyright © 2005 Perot Systems.Resources SQL Server Performance Tuning ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ SQL Server Books Online Kalen Delaney: Inside Microsoft SQL Server 2000.com http://www.com/ http://www. All trademarks are the property of their respective owners. All rights reserved.NET Application Performance and Scalability http://www.windowsitpro.

and other countries. All rights reserved.perotsystems. Results. 36 . www.Q&A PEROT SYSTEMS and the PEROTSYSTEMS logo are registered or unregistered trademarks of Perot Systems in the United States. All trademarks are the property of their respective owners. Processes. People.com Copyright © 2005 Perot Systems. the EU. Technology.