Καθημερινά δέχομαι ερωτήματα που αφορούν θέματα απόδοσης και αυτό που έχω διαπιστώσει είναι ότι υπάρχει μια σημαντική έλλειψη γνώσης και εμπειρίας στο συγκεκριμένο θέμα.
Οι περισσότεροι ψάχνουν απεγνωσμένα στον ιστό και σε αυτόν βρίσκουν μεμονωμένες πληροφορίες που σπάνια μπορεί να τους βοηθήσουν για να εντοπίσουν αρχικά και κατόπιν να λύσουν το πρόβλημα.
Αυτό που λέω πάντα είναι ότι για να λύσεις ένα πρόβλημα πρέπει να το έχεις βρει και να το έχεις καταλάβει. Για αυτό το λόγο θα ξεκινήσω μια σειρά από άρθρα (και αυτό είναι το πρώτο) με το οποίο θα σας παρουσιάσω τα εργαλεία που έχουμε στο SQL Server ώστε να μπορούμε να εντοπίσουμε τα προβλήματα αρχίζοντας με τα sessions που έχουμε στο instance μας και τα οποία φυσικά είναι αυτά που δίνουν και τις εργασίες σε αυτό. Είναι το πρώτο και βασικό στοιχείο που πρέπει να γνωρίζουμε για την επίλυση του εκάστοτε προβλήματος.
Ο SQL Server παρέχει πλήθος από DMVs που μας επιτρέπουν σε πραγματικό χρόνο να μπορούμε να δούμε την δραστηριότητα των χρηστών που είναι συνδεδεμένοι στο instance μας και να μπορούμε να καταλάβουμε τι εκτελούν, τι πόρους καταναλώνουν, τι προβλήματα αντιμετωπίζουν και ποιο είναι αυτό που τους κάνεις να μην έχουν την επιθυμητή απόδοση.
Αυτά τα DMV είναι τα παρακάτω και καλό είναι να δείτε αυτά στο documentation.
sys.dm_exec_connections
Από τα βασικά DMV καθώς παρέχει σημαντικές πληροφορίες σχετικά με το session και το πως αυτό έχει γίνει και από που στο instance. Όλα τα στοιχεία που αυτό παρέχει είναι σημαντικά αλλά μπορώ να ξεχωρίσω τα net_transport, protocol_type, endpoint_id, auth_scheme, client_net_address, client_tcp_port και το most_recent_sql_handle.
sys.dm_exec_sessions
Παρέχει πληροφορίες που όλα τα sessions (user & internals) τα οποίο μπορούμε να το ξεχωρίσουμε με το is_user_process field. Με το DMV αυτό μπορούμε να δούμε όλα τα session options που αυτό έχει ενεργά και έτσι μπορούμε να καταλάβουμε στοιχεία σημαντικά όπως το transaction_isolation_level, τα ansi options που έχει το status τα login_name, nt_user_name. Ακόμα ενδιαφέρον έχουν τα login_time, host_name, host_process_id και φυσικά οι καταναλώσεις που αυτό έχει κάνει στους διάφορους πόρους.
sys.dm_exec_requests
Παρέχει πληροφορίες για το τι εκτελείται την στιγμή αυτή πάνω στο instance. Είναι από το κεντρικά DMVs που χρησιμοποιούνται. Ενδιαφέρον έχουν τα πεδία block_session_id, command, dop, last_wait_type, percent_complete, status, transaction_isolation_level, wait_time, wait_type.
sys.dm_tran_session_transactions
Παρέχει πληροφορίες για τα transactions που το κάθε session εκτελεί την στιγμή αυτή.
sys.dm_exec_session_wait_stats
Υπάρχει από τον SQL Server 2016 και παρέχει σημαντικότατες πληροφορίες για το που κάθε session thread καθυστερεί.
sys.dm_os_waiting_tasks
Παρέχει πληροφορίες για τo wait queue των tasks και είναι δίνουμε ιδιαίτερη σημασία στα πεδία blocking_session_id, resource_id, wait_type, wait_duration_ms.
Combine All
Αν και το κάθε ένα μεμονωμένα δίνει αρκετές πληροφορίες αυτό που συνηθίζουμε να κάνουμε είναι να συνδυάζουμε τις πληροφορίες από αυτά και αυτό μπορεί να γίνει με ένα join καθώς όλα περιέχουν το session_id field που μπορεί να τα ενώσει.
Μπορώ και γράφω αρκετά queries με αυτά ενδεικτικά με το παρακάτω μπορώ να δω όλα τα sessions που έχουν γίνει στο instance και την κατανάλωση πόρων που έχουν κάνει.
select c.session_id, c.net_transport, c.encrypt_option, c.auth_scheme,
s.host_name, s.program_name, s.client_interface_name, s.login_name, s.nt_domain,
s.nt_user_name, c.connect_time, s.login_time, s.reads, s.writes, s.logical_reads, s.status,
s.cpu_time, s.total_scheduled_time, s.total_elapsed_time
from sys.dm_exec_connections as c
inner join sys.dm_exec_sessions as s on c.session_id = s.session_id;
//antonch