Πώς βρίσκουμε τι καθυστερεί τα queries στον SQL Server

Πώς βρίσκουμε τι καθυστερεί τα queries στον SQL Server
Πώς βρίσκουμε τι καθυστερεί τα queries στον SQL Server

Πολλές φορές θα δούμε να καθυστερεί ένα query και θα θέλαμε να ξέρουμε τι είναι αυτό που το καθυστερεί. Για να το κάνουμε αυτό θα πρέπει να γνωρίζουμε τα wait types και τι σημαίνει το καθένα από αυτά.

Συγκεκριμένα types μπορούν να δείξουν τι καθυστερεί ένα query κατά την εκτέλεση. Παρόμοια, υψηλά waits σε χρόνο και αριθμό μπορούν να φανούν συγκεντρωτικά και σε επίπεδο instance.

Υπάρχει αναλυτικά η λίστα με όλα τα wait types εδώ.

Τα πιο συχνά wait types

  • SOS_SCHEDULER_YIELD: δείχνει υψηλή χρήση CPU. Μπορεί να οφείλεται σε χρήση intensive CPU tasks όπως recompile πλάνων.
  • CXPACKET: αυτό το wait οφείλεται στην αναμονή όλων των thread της παραλληλίας μέχρι να ολοκληρωθούν. Δημιουργείται καθώς το κάθε thread δέχεται μη-αναλογικό βάρος για την ολοκλήρωση της εργασίας του καθενός. Η λύση στο πρόβλημα μπορεί να είναι η αύξηση του cost threshold of parallelism.
  • WRITELOG: δείχνει καθυστέρηση στο I/O του transaction log. H μεταφορά των transaction logs σε διαφορετικούς γρήγορους δίσκους θα μπορεί να το μειώσει.
  • LCK_M_IX: συμβαίνει όταν υπάρχει lock στον πίνακα ή page του από insert ή update, μπορεί να οφείλεται σε έλλειψη κάποιου index ή στο ότι είναι fragmented.
  • LCK_M_X: δείχνει ότι υπάρχει καθυστέρηση λόγω row locks. Μπορει να συμβαίνει λόγω της χρήσης ενός περιοριστικού isolation level.
  • ASYNC_NETWORK_IO: δείχνει ότι υπάρχει καθυστέρηση από τον SQL Server που περιμένει τον client να τελειώσει την επεξεργασία που κάνει στα δεδομένα.
  • PAGEIOLATCH_SH: δείχνει την καθυστέρηση στο να φορτωθούν pages από τον δίσκο στη μνήμη. Μπορεί να οφείλεται σε μειωμένη μνήμη RAM που οδηγεί στο να μην μπορεί να κρατηθεί μεγάλος αριθμός pages, μπορεί όμως και να οφείλεται σε χαμηλό I/O στους φυσικούς δίσκους.
  • PAGELATCH_EX: συνήθως οφείλεται σε πολλαπλά διαδοχικά inserts με identity στο primary key. Mπορεί επίσης να δείχνει ότι δεν έχουν αρκετά database files στην tempdb.

Πώς βρίσκουμε τι καθυστερεί συγκεκριμένο query

Όταν ένα query εκτελείται μπορούμε μέσα από το dynamic view sys.dm_exec_requests να βρούμε το last_wait_type ώστε να δούμε τι φαίνεται να καθυστερεί αυτή την στιγμή το query.

SELECT d.name,p.command,p.session_id,t.text,p.start_time,p.status,p.total_elapsed_time/1000 as elapsed_time_secs,wait_time/1000 as wait_time,last_wait_type,p.blocking_session_id,m.granted_memory_kb,m.grant_time,p.plan_handle,ph.query_plan,p.sql_handle,dr.host_name,dr.program_name,dr.login_name
FROM sys.dm_exec_requests p
inner join sys.databases d on d.database_id = p.database_id
outer apply sys.dm_exec_sql_text(p.sql_handle) t
outer apply sys.dm_exec_query_plan(p.plan_handle) as ph
inner join sys.dm_exec_sessions dr on dr.session_id = p.session_id
left join sys.dm_exec_query_memory_grants m on m.session_id = p.session_id
where 1=1
and text is not null
--and p.session_id in (select spid from sysprocesses where blocked<>0) --find blocked only
order by  p.start_time
Πώς βρίσκουμε τι καθυστερεί τα queries στον SQL Server

Wait statistics σε ολόκληρο το instance

Μπορούμε όμως να δούμε και συνολικά τα top 10 waits που είχε το SQL Server instance από την τελευταία φορά που έγινε restart ή DBCC SQLPERF (‘sys.dm_os_wait_stats’, CLEAR):

select top 10 * from sys.dm_os_wait_stats 
order by  wait_time_ms desc
Πώς βρίσκουμε τι καθυστερεί τα queries στον SQL Server

Πηγές:

Μοιράσου το

Αφήστε μία απάντηση