Microsoft SQL Server Query Tuning Query Tuning - Meetup

2 downloads 133 Views 926KB Size Report
SQL Diagramming. ▫ Great Book “SQL Tuning” by Dan Tow. • Great book that teaches SQL Diagramming registration .03. • http://www.singingsql.com g. 37. 1.
Microsoft SQL Server Query Tuning Query Tuning  Speaker: Dean Richards Senior DBA, Confio Software Silicon Valley SQL Server User Group November 2010

Mark Ginnebaugh, User Group Leader,  [email protected]

Query Tuning Get it Right the First Time Dean Richards Senior DBA, Confio Software

2

Who Am I?  Dean Richards,, of course!  20+ Years in SQL Server & Oracle • DBA and Developer p

 Senior DBA for Confio Software • [email protected] • Makers of Ignite8 Response Time Analysis Tools • http://www.ignitefree.com – only free RTA Tool

 Specialize in Performance Tuning  Presented at 24 Hours of PASS  13 SQL Saturdays and counting… 3

Agenda    

Introduction Which Query Should I Tune Query Plans SQL Diagramming • •

4

Who registered g yesterday y y for Tuning g Class Check order status

Why Focus on Queries  Most Applications • Read and Write data to/from database • Simple manipulation and smaller amounts of data • Inefficiencies would not be noticed

 Most Queries • Examine larger amounts of data, return a little • Inefficiencies quickly become bottleneck

 Whyy Tune Q Queries? • “Gives the most bang for your buck” • Changes to SQL are usually safer • ~85% of performance issues are SQL related 5

Who Should Tune  Developers? p • • • • •

Developing applications is very difficult Typically focused on functionality Not much time left to tune SQL Do not get enough practice SQL runs differently diff tl in i Production P d ti than th Dev/Test D /T t

 DBA? • Do D nott kknow th the code d lik like developers d l do d • Focus on “Keep the Lights On” • Very complex environment 6

 Need a team approach

Which SQL       

User / Batch Job Complaints Queries Performing Most I/O (LIO (LIO, PIO) Queries Consuming CPU Queries Doing Table or Index Scans Known Poorly Performing SQL Server Side Tracing Highest Response Times (Ignite8)

SELECT sql_handle, statement_start_offset, statement end offset, plan statement_end_offset, plan_handle, handle, execution execution_count, count, total_logical_reads, total_physical_reads, total_elapsed_time, st.text FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st ORDER BY total_elapsed_time DESC 7

Why is SQL Slow – Wait States Focus on Response Time

   8

Understand the total time a Query spends in Database Measure time while Query executes SQL Server helps by providing Wait Types

Wait Time Tables (SQL 2005/8) http://msdn.microsoft.com/en-us/library/ms188754.aspx dm_exec_requests start_time status sql_handle plan handle plan_handle start/stop offset database_id user_id blocking_session wait_type yp wait_time

dm_exec_query_stats execution_count total_logical_writes total_physical_reads total logical reads total_logical_reads total_elapsed_time

dm_exec_query_plan query plan

dm_exec_text_query_plan query plan dm_exec_sessions login_time login_name host_name program name program_name session_id

9

dm_exec_sql_text t t text

Base Monitoring Query INSERT INTO SessionWaitInfo SELECT r.session_id, i id r.sql_handle, l h dl r.statement_start_offset, t t t t t ff t r.statement_end_offset, r.plan_handle, r.database_id, r.blocking_session_id, r.wait_type, r.query_hash, s.host_name, s.program_name, s.host_process_id, s.login_name, CURRENT_TIMESTAMP cdt FROM sys sys.dm_exec_requests dm exec requests r INNER JOIN sys.dm_exec_sessions s ON s.session_id = r.session_id WHERE r.status 'background' AND r.command d 'AWAITING COMMAND' AND s.session_id > 50 AND s.session_id @@SPID

10

RTA - Proactive

11

RTA - Firefighting

12

RTA - Correlation

13

Sample Wait Types  WRITELOG • Waiting for a log flush to complete

 LCK_M_S, LCK_M_U, LCK_M_X… • Waiting to acquire locks

 NETWORKIO, ASYNC_NETWORK_IO • Waiting on the network

 PAGEIOLATCH_SH, PAGEIOLATCH_EX… • Physical disk reads

 WAITFOR (idle event) • Waiting W i i during d i a WAITFOR command d 14

Tracing   

  

15

Tracing with waits gathers very good data C be Can b High Hi h Overhead O h d via i Profiler P fil Use Server-Side Tracing • • • •

sp_trace_create p_ _ – create the trace definition sp_trace_setevent – add events to trace sp_trace_setfilter – apply filters to trace sp trace sp_t ace_setstatus setstatus – sta start/stop t/stop tthe e ttrace ace

Use Profiler to Create Initial Trace • Use File > Script Trace to Get Script

Cumbersome to review data Set trace file sizes appropriately

Summary of Response Time  Using Response Time Analysis (RTA) Ensures    

you Work on the Correct Problem Shows Exactly Why Performance is Suffering Helps l Prioritize Problems bl Do Not Rely Exclusively on Health Stats (CPU Utilization Disk IO Utilization, IO, Cache Hit Ratio) Data Collection • DMVs – build it yourself • Tracing – know how to process trace data • Tools – Ensure they use Wait Time and Health

16

Why is SQL Slow - Plans  SQL Server Management Studio • Estimated Execution Plan - can be wrong • Actual Execution Plan – must execute query, can be dangerous in production and also wrong in test

 SQL Server Profiler Tracing • Event to collect: Performance : Showplan All • Works when you know a problem will occur

 DM_EXEC_QUERY_PLAN, DM EXEC QUERY PLAN

DM_EXEC_TEXT_QUERY_PLAN(@handle,@s,@e) • Real execution p plan of executed query q y

17

DM_EXEC_QUERY_PLAN

18

Case Studies  SQL Q Diagramming g g • •

19

Who registered yesterday for Tuning Class Check order status

SQL Statement 1  Who registered yesterday for SQL Tuning SELECT s.fname, s.lname, r.signup_date FROM student s INNER JOIN registration i t ti r ON s.student_id t d t id = r.student_id t d t id INNER JOIN class c ON r.class_id = c.class_id WHERE c.name = 'SQL TUNING' AND r.signup_date BETWEEN @BeginDate AND @EndDate AND r.cancelled = 'N'

 Execution Stats – 9,634 Logical Reads

20

Database Diagram

21

Execution Plan

Recommendation R d ti from f SSMS CREATE NONCLUSTERED INDEX [] ON [dbo].[registration] ([cancelled],[signup_date]) INCLUDE ([student_id],[class_id]) ([student id] [class id]) 22

SQL Diagramming 

Great Book “SQL Tuning” by Dan Tow

• Great book that teaches SQL Diagramming • http://www.singingsql.com

registration g 37 1

student

.03

1293 1

class

.001

select count(1) from registration where cancelled = 'N' and signup_date between '2010-04-23 00:00' and '2010-04-24 00:00' 54,554 / 1,639,186 = 0.03 select count(1) from class where name = 'SQL SQL TUNING TUNING' 2 / 1,267 = .001 23

New Execution Plan CREATE INDEX cl_name ON class(name)

  24

Execution Stats – 9,139 Logical Reads Why would an Index Scan still occur on REGISTRATION?

Database Diagram

25

New Execution Plan CREATE INDEX reg_alt ON registration(class_id)

 26

Execution Stats – 621 Logical Reads

Better Execution Plan CREATE INDEX reg_alt ON registration(class_id) INCLUDE (signup_date, (signup date cancelled)

 27

Execution Stats – 20 Logicall Reads d

Alternative from SSMS CREATE INDEX reg_can ON registration(cancelled, signup_date) INCLUDE (class_id, student_id)



28

Execution Stats – 595 Logical Reads

CREATE NONCLUSTERED INDEX [] ON [dbo].[registration] ([class_id],[cancelled],[signup_date]) INCLUDE ([student_id])

SQL Statement 2  Paychecks for specific employees SELECT e.first_name, e.last_name, l.description FROM emp e INNER JOIN loc l ON e.loc_id = l.loc_id WHERE (e.first_name = @fname OR e.last_name = @lname) AND EXISTS ( SELECT 1 FROM wage_pmt t w WHERE w.emp_id = e.emp_id AND w.pay_date>= DATEADD(day,-31,CURRENT_TIMESTAMP) )

 Execution Stats – 64,206 Logical Reads 29

Database Diagram

30

SQL Diagramming wage_pmt

.02

90 1

emp

.0005

.0009

1000 1

loc select count(1) from wage_pmt where pay_date >= DATEADD(day,-31,CURRENT_TIMESTAMP) 40,760 / 1,915,088 = .02 select top 5 first_name, count(1) from emp group by first_name order by 2 desc 12 / 23,798 = .0005 – first_name 22 / 23,789 = .0009 – last_name 31

Execution Plan

32

New Execution Plan CREATE INDEX ix2_fname ON emp(first_name)

33

Which Index? SSMS Recommendation CREATE INDEX wp wp_pay_date pay date ON wage wage_pmt(pay_date) pmt(pay date) INCLUDE (emp_id) 50 000 Logical 50,000 L i l Reads R d or… Better Option CREATE INDEX wp wp_emp_pd emp pd ON wage wage_pmt(emp_id, pmt(emp id, pay_date) pay date) 46 Logical Reads

34

New Execution Plan CREATE INDEX wp_emp_pd ON wage_pmt(emp_id, pay_date)

35

SQL Statement 2  Lookup order status for caller SELECT o.OrderID, c.LastName, p.ProductID, p.Description, sd.ActualShipDate, sd.ShipStatus, sd.ExpectedShipDate FROM [Order] o INNER JOIN Item It i ON i.OrderID i O d ID = o.OrderID O d ID INNER JOIN Customer c ON c.CustomerID = o.CustomerID INNER JOIN ShipmentDetails sd ON sd.ShipmentID = i.ShipmentID LEFT OUTER JOIN Product p ON p.ProductID = i.ProductID LEFT OUTER JOIN Address a ON a.AddressID = sd.AddressID WHERE c.LastName LIKE ISNULL(@LastName,'') + '%' --AND c.FirstName LIKE ISNULL(@FirstName,'') + '%' AND o.OrderDate >= DATEADD(day, -30, CURRENT_TIMESTAMP) AND sd.ShipStatus 'C'

 Execution Stats – 10,159 10 159 Logical Reads 36

Database Diagram

37

Execution Plan

38

SQL Diagramming o

c

i sd

.08

.005

.03

p

a SELECT COUNT(1)*1.0/(SELECT COUNT(1) WHERE LastName LIKE 'SMI%' .03 SELECT COUNT(1)*1.0/(SELECT COUNT(1) WHERE OrderDate >= DATEADD(day, -30, .08 SELECT COUNT(1)*1.0/(SELECT COUNT(1) WHERE OrderStatus 'C' .005 -- Combined .005 39

FROM Customer) FROM Customer

FROM [Order]) FROM [Order] CURRENT_TIMESTAMP) FROM [Order]) FROM [Order]

Data Skew Problems SELECT OrderStatus, COUNT(1) FROM [Order] GROUP BY OrderStatus

 Only 0.5% of rows are ‘C’  How about changing g g the query? q y • AND o.OrderStatus = 'I'

 Add an Index on ShipStatus 40

New Execution Plan CREATE INDEX IX2_OrderStatus ON [Order] (OrderStatus) INCLUDE (OrderID,CustomerID) ( , )

41

Execution Stats – 3,052 Logical Reads

Takeaway Points  Tuning Queries gives more “bang for the buck”  Make M k sure you are tuning t i the th correctt query  Use Wait Types and Response Time Analysis • Locking L ki problems bl may not be b a Query Q Tuning T i issue i • Wait types tell you where to start

 Use “Real Execution Plans” • Get plan_handle from DM_EXEC_REQUESTS • Pass plan plan_handle handle to DM_EXEC_QUERY_PLAN() DM EXEC QUERY PLAN()

 SQL Diagramming - “Get it right the First Time” • Query Tuner Tools can mislead you

Confio Software  Wait-Based Performance Tools  Igniter Suite • Ignite g for SQL Q Server,, Oracle,, DB2,, Sybase y • Ignite for Databases on VMWare (Beta)

    43

Helps show which SQL to tune Provides visibility into entire stack Based in Colorado,, worldwide customers Free trial at www.confio.com

To learn more or inquire about speaking opportunities, please contact: Mark Ginnebaugh, User Group Leader [email protected] http://www.meetup.com/The‐SiliconValley‐SQL‐Server‐User‐Group/

Suggest Documents