Πώς βρίσκουμε τι καθυστερεί τα queries στον SQL Server
- Πώς συλλέγουμε to actual execution plan από τα queries με χρήση Extended Event και πως διαβάζουμε τα δεδομένα του - 2 Δεκέμβριος 2024
- Πώς βρίσκουμε τι δικαιώματα έχει ένας χρήστης σε βάση δεδομένων της Oracle - 1 Νοέμβριος 2024
- Πώς ενεργοποιούμε το Unified Auditing σε Oracle Database - 7 Οκτώβριος 2024
Πολλές φορές θα δούμε να καθυστερεί ένα 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
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