SQL SERVER QUERY TUNING BEST PRACTICES Aaron Bertrand SQL Sentry, Senior Consultant @AaronBertrand Kevin Kline SQL Sentry, Dir of Engineering Services @KEKline NEW eBOOK AVAILABLE! We’re giving away 3 Rookie Experience packages and 3 Ride Along packages from the Richard Petty Driving Experience at Charlotte Motor Speedway on October 18, 2013. AGENDA • • • • • • Introducing Your Speakers A Query Tuning Methodology – Kevin Measuring Query Performance – Kevin Query Tuning Patterns & Anti-Patterns – Aaron Follow Up Prizes! MEAT-HEAD-OLOGY Configure the test environment • Take initial measurements Run the test • Take comparative measurements Assess the findings • Know what to look for. TEST ENVIRONMENT • Your query test harness should include some stuff. • Code to clear the caches: * o DBCC [FreeProcCache | FreeSystemCache | FlushProcInDB(<dbid>) ] o DBCC DropCleanBuffers • Code to set measurements: o SET STATISTICS TIME o SET STATISTICS IO o SET SHOWPLAN [TEXT | XML] • Code for Dynamic Management Views (DMV) checks. o System info – sys.dm_os_performance_counters and o Yeah, ok. But which query DMVs? sys.os_wait_stats PERIODIC TABLE OF SQL SERVER DYNAMIC MANAGEMENT OBJECTS DM_OS_WAIT_STATS • “The Waiting is the Hardest Part”. • Bottlenecks. • Caveats for Relying on Wait Stats. • Querying methodology around “The” Wait Stats DMV. DM_EXEC_QUERY_STATS • Query Performance Information • System Resource Consumption: o CPU o Memory o IO DM_DB_INDEX_USAGE_STATS • Reads by scans, seeks, lookups for both system and user activity. • Writes for both system and user activity. • Returns results for all databases, indexes so refine with predicates. DM_IO_VIRTUAL_FILE_STATS • IO activity breakdown for each SQL data and log file on the instance. • Provides file size information too. • It’s a function (DMF) so you must pass those parameters in! DM_EXEC_REQUESTS • Active requests being serviced. • What users are doing on your instance. DEMO! • Usually requires additional info from dm_exec_sessions and the SQLOS DMOs. ASSESSING THE FINDINGS • Red Flags Query Operators: o o o o Lookups Scans Spools Parallelism Operations • Red Flags Elsewhere: o o o o o Dissimilar estimated versus actual row counts High physical reads Missing statistics alarms Large sort operations Implicit data type conversions • Using live demo, we’ll show you patterns to use and antipatterns to beware. PATTERNS AND ANTI-PATTERNS • • • • • • • • • • WHERE IN versus WHERE EXISTS UNION versus UNION ALL WHERE {NOT IN | EXISTS} versus LEFT JOIN Tuning for SELECT versus INSERT, UPDATE, and DELETE Compound index columns TEASE! Covering indexes The Transitive Property Queries with IN (…) or OR Queries with LIKE ‘%’ Functions and calculations in WHERE or JOIN DEMOS: DEFAULT CURSORS • Cursors are usually unnecessary, but when they are, use the right options • The defaults are heavy-handed and guaranteed to be slow • Blog post: http://bit.ly/AB-cursors DEMOS: CORRELATED SUBQUERIES • Coercing SQL Server to evaluate multiple times • Think about converting these to joins • Gives the optimizer a fighting chance DEMOS: NOT IN • Dangerous if source column is NULLable • LEFT OUTER JOIN is not always a good alternative • NOT EXISTS and EXCEPT are better (but can behave differently) • Blog post: http://bit.ly/AB-NOTIN FOLLOW UP 1. Engage with our community: SQL Sentry on Facebook, SQLSentry.Net, SQLPerformance.com. 2. Share your tough SQL Server problems with us: http://answers.sqlperformance.net 3. Download SQL Sentry Plan Explorer for free: http://www.sqlsentry.net/plan-explorer/sql-serverquery-view.asp 4. Check out our other award winning tools: http://www.sqlsentry.net/download