TEN QUERY TUNING TECHNIQUES Every SQL Programmer Should

  • Slides: 25
Download presentation
TEN QUERY TUNING TECHNIQUES Every SQL Programmer Should Know Kevin Kline Director of Engineering

TEN QUERY TUNING TECHNIQUES Every SQL Programmer Should Know Kevin Kline Director of Engineering Services at SQL Sentry Microsoft MVP since 2003 Facebook, Linked. In, Twitter at KEKLINE KEKline@sqlsentry. com Kevin. EKline. com, For. ITPros. com

FOR FRIENDS OF SQL SENTRY • Free Plan Explorer download: http: //www. sqlsentry. net/plan-explorer/

FOR FRIENDS OF SQL SENTRY • Free Plan Explorer download: http: //www. sqlsentry. net/plan-explorer/ • Free query tuning consultations: http: //answers. sqlperformance. com. • Free new ebook (regularly $10) to attendees. Send request to sales@sqlsentry. net. • SQL Server educational videos, scripts, and slides: http: //SQLSentry. TV • Tuning blog: http: //www. sqlperformance. com/ • Monthly e. News tips and tricks: http: //www. sqlsentry. net/newsletterarchive. asp

AGENDA • Introductions • Test & tuning environment • 1. Clearing caches • Looking

AGENDA • Introductions • Test & tuning environment • 1. Clearing caches • Looking for red flags • 2. Reading execution plans • Query tuning techniques: • 8 more specific examples of widespread approaches that lead to poor performance • Summary

TEST & TUNING ENVIRONMENT • Code to clear the caches*: o CHECKPOINT o DBCC

TEST & TUNING ENVIRONMENT • Code to clear the caches*: o CHECKPOINT o DBCC [Free. Proc. Cache | Free. System. Cache | Flush. Proc. In. DB(<dbid>) ] o DBCC Drop. Clean. Buffers • Code to set measurements: o SET STATISTICS [TIME | IO] o SET SHOWPLAN [TEXT | XML] or Graphic Execution Plans • Code for Dynamic Management Views (DMV) checks. o System info – sys. dm_os_performance_counters, sys. dm_os_wait_stats o Query info – sys. dm_exec_requests o Index info – sys. dm_db_index_usage_stats, sys. dm_io_virtual_file_stats

RED FLAGS IN YOUR SQL CODE • Red Flags Query Operators: o Lookups, Scans,

RED FLAGS IN YOUR SQL CODE • Red Flags Query Operators: o Lookups, Scans, Spools, Parallelism Operations • Other Red Flags: o o o Dissimilar estimated versus actual row counts High physical reads Missing statistics alarms Large sort operations Implicit data type conversions

DEMOS: DEFAULT CURSORS • I don’t always use cursors… o o …but when I

DEMOS: DEFAULT CURSORS • I don’t always use cursors… o o …but when I do, I avoid the default options Slow and heavy-handed: Global, updateable, dynamic, scrollable I use LOCAL FAST_FORWARD May want to test STATIC vs. DYNAMIC, when tempdb is a bottleneck • Blog post: http: //bit. ly/AB-cursors

DEMOS: WHERE IN VERSUS WHERE EXISTS • There are lots of ways to find

DEMOS: WHERE IN VERSUS WHERE EXISTS • There are lots of ways to find data existing within subsets: • IN, EXISTS, JOIN, Apply, subquery • Which technique is best? • Blog post: http: //bit. ly/AB-NOTIN

OPTIMIZING FOR SELECT VERSUS DML • Big differences between a SELECT and a DML

OPTIMIZING FOR SELECT VERSUS DML • Big differences between a SELECT and a DML statement that effects the same rows. • Shouldn’t blindly create every index the Tuning Advisor or execution plan tells you to! • Blog post - http: //bit. ly/AB-Blind. Index

READS & INDEX STRUCTURE • 8 K pages • Leaf pages ARE the data.

READS & INDEX STRUCTURE • 8 K pages • Leaf pages ARE the data. • Non-leaf pages are pointers. Root Page Intermediate Pages Leaf Pages Level 2 Level 1 Level 0

WRITES & INDEX STRUCTURE • Each change to the leaf pages requires all index

WRITES & INDEX STRUCTURE • Each change to the leaf pages requires all index structures be updated. Root Page Intermediate Pages Leaf Pages Level 2 Level 1 Level 0 DML Page Split Actual placement

DEMOS: UNWANTED RECOMPILES Execution In Memory? NO Load metadata compile YES Re. Comp Execute

DEMOS: UNWANTED RECOMPILES Execution In Memory? NO Load metadata compile YES Re. Comp Execute optimize

CAUSES OF RECOMPILE • Expected: Because we request it: • CREATE PROC … WITH

CAUSES OF RECOMPILE • Expected: Because we request it: • CREATE PROC … WITH RECOMPILE or EXEC myproc … WITH RECOMPILE • SP_RECOMPILE foo • Expected: Plan was aged out of memory • Unexpected: Interleaved DDL and DML • Unexpected: Big changes since last execution: • Schema changes to objects in underlying code • New/updated index statistics • Sp_configure

INTERLEAVED DDL AND DML • • • CREATE PROC testddldml AS … ; CREATE

INTERLEAVED DDL AND DML • • • CREATE PROC testddldml AS … ; CREATE TABLE #testdml; <some T-SQL code here> INSERT INTO #testdml; <some T-SQL code here> ALTER TABLE #testdml; <some T-SQL code here> INSERT INTO #testdml; <some T-SQL code here> DROP TABLE #testdml; <some T-SQL code here> -- (DDL) -- (DML + RECOMPILE) -- (DDL)

DEMOS: THE "KITCHEN SINK" PROCEDURE • Usually see it as a one-query-for-all-queries procedure, or

DEMOS: THE "KITCHEN SINK" PROCEDURE • Usually see it as a one-query-for-all-queries procedure, or even one-proc-for-all-transactions procedure: o Where name starts with S, or placed an order this year, or lives in Texas o Insert AND Update AND Delete AND Select • Conflicting optional parameters make optimization impossible o OPTION (RECOMPILE) o Dynamic SQL + Optimize for ad hoc workloads o Specialized procedures • Better approach? o Specialize and optimize each piece of code to do ONE THING really effectively

DEMOS: SP_EXECUTESQL VS. EXEC(…) • I don’t always use dynamic SQL… o o …but

DEMOS: SP_EXECUTESQL VS. EXEC(…) • I don’t always use dynamic SQL… o o …but when I do, I always use sp_executesql Less fuss with concatenation and implicit/explicit conversions Better protection against SQL injection (but not for all things) At worst case, behavior is the same • Can promote better plan re-use • Encourages strongly typed parameters instead of building up a massive string

IMPLICIT CONVERSIONS • SQL Server has to do a lot of extra work /

IMPLICIT CONVERSIONS • SQL Server has to do a lot of extra work / scans when conversion operations are assumed by the SQL programmer. • Happens all the time with data types you’d think wouldn’t need it, e. g. between date types and character types. • Very useful data type conversion chart at http: //bit. ly/15 b. DRRA. • Data type precedence call also have an impact: http: //bit. ly/13 Zio 1 f.

IMPLICIT CONVERSION RESOURCES • Ian Stirk’s Column Mismatch Utility at http: //www. sqlservercentral. com/articles/Administration/6

IMPLICIT CONVERSION RESOURCES • Ian Stirk’s Column Mismatch Utility at http: //www. sqlservercentral. com/articles/Administration/6 5138/. • Jonathan Kehayias’ plan cache analyzer at http: //sqlblog. com/blogs/jonathan_kehayias/archive/2010 /01/08/finding-implicit-column-conversions-in-the-plancache. aspx. • Jonathan Kehayias’ index scan study at http: //www. sqlperformance. com/2013/04/t-sqlqueries/implicit-conversion-costs

DEMOS: COMMA-DELIMITED PARAMETERS • Example: pass a comma-separated list of Order. IDs • String

DEMOS: COMMA-DELIMITED PARAMETERS • Example: pass a comma-separated list of Order. IDs • String splitting is expensive, even using CLR • Table-valued parameters are typically a better approach

DEMOS: TEMPORARY STRUCTURES • Which are better, temp tables or temp variables? Temp Table

DEMOS: TEMPORARY STRUCTURES • Which are better, temp tables or temp variables? Temp Table Temp Variable Stored in? Tempdb Statistics? Yes No (1 row) Indexs/Keys? Yes 1 UK / PK only Truncate? Yes No Recompiles? Yes No Parallelism? Yes No Metadata Overhead? Lowest Lock Overhead? Normal Lowest

CODING STANDARDS AND DISSIMILARITY • Might sound frivolous, but naming schemes are important o

CODING STANDARDS AND DISSIMILARITY • Might sound frivolous, but naming schemes are important o Convention is not important; but rather being consistent and logical • Story: dbo. Update. Customer vs. dbo. Customer_Update • Always specify schema when creating, altering, referencing objects o Object resolution works a little bit harder without it o More importantly, it can get the wrong answer o And will often yield multiple copies of the same plan • Do not use the sp_ prefix on stored procedures o This has observable overhead, no matter how specific you are

MIMICKING PRODUCTION • Your dev machine is usually nothing like production o Build representative

MIMICKING PRODUCTION • Your dev machine is usually nothing like production o Build representative data when you can o Build a stats-only database when you can’t (a. k. a. a database clone) • Will allow you to see plan issues, but not speed o Make sure settings are the same • @@VERSION, edition • Max memory if possible, sp_configure options • Logins (and permissions), tempdb settings • Parameterization settings, recovery model, compression, snapshot isolation • Compatibility level (usually not an issue when working with a restore) • Run a full business cycle workload after a restore o Simulate equivalent hardware: DBCC OPTIMIZER_WHATIF o Use Distributed Replay when you can • Not perfect, but more realistic than single-threaded trace replay

SUMMARY Test Ha rn stable r ess for your S esults. QL Cod e

SUMMARY Test Ha rn stable r ess for your S esults. QL Cod e to en sure Remem ber the re against SQL Se d flags in SQL rver. code ru nning Plus 8 m ore cod ing tech niques: 1. Wri ting “go od” cur sors 2. WH ERE IN versus WHERE 3. The EXISTS nature of ind Reads v ersus W exes and Opti mizing rites 4. Ina for dverten t recom piles 5. EXE C versu s SP_EX ECUTES 6. Dat QL a types and Im plicit co 7. Dis nversio similar n e xecutio plan ca n plans che blo and tra at cking 8. Mim icking t he prod uction More in environ fo? ment Let’s connect! Facebook, Linked. In, Twitter at KEKLINE. Email at KEKline@sqlsentry. com Blogs at http: //Kevin. EKline. com And http: //For. ITPros. com

WRAP UP Engage with us on social media o I’m thankful for your word

WRAP UP Engage with us on social media o I’m thankful for your word of mouth promotions and endorsements! Share your tough SQL tuning problems with us: http: //answers. sqlperformance. com Download SQL Sentry Plan Explorer for free: http: //www. sqlsentry. com/plan-explorer/ Check out our other award winning tools: http: //www. sqlsentry. net/download

NOLOCK http: //www. flickr. com/photos/relyjus/4289185639/

NOLOCK http: //www. flickr. com/photos/relyjus/4289185639/

NOLOCK • It is a turbo button …if you’re ok with inaccuracy • There

NOLOCK • It is a turbo button …if you’re ok with inaccuracy • There are times it is perfectly valid o Ballpark row counts o Please use session-level setting, not table hint • Usually, though, better to use SNAPSHOT or RCSI o But test under heavy load