go backsqlschool blogs list

Monitoring CREATE INDEX Progress

by Antonios Chatzipavlis

Όσοι από εμάς έχουν περάσει ή είναι DBA σε μεγάλες databases καθημερινά αντιμετωπίζουμαι πολλά ενδιαφέροντα θέματα. Ένα από αυτά είναι η συντήρηση και η δημιουργία των indexes σε μεγάλου όγκου databases. Ειδικότερα αυτό που ζητάμε είναι να γνωρίζουμε το progress της δημιουργίας ώστε να είμαστε σε θέση να εκτιμήσουμε την ολοκλήρωση της εργασίας.

Από το SQL Server 2014 (και είναι ένα λόγος να κάνει κάποιος upgrade αν είναι σε παλαιότερες εκδόσεις) έχουμε επιπλέον στα χέρια μας (εκτός του ΟNLINE option που έχουμε από το SQL Server 2012) την δυνατότητα να κάνουμε real time monitoring σε queries χρησιμοποιώντας την DMV sys.dm_exec_query_profiles η οποία αν δεν είναι γνωστό (τώρα θα είναι) είναι και η βάση του Live Query Statistics.

Για να μπορέσω να έχω την δυνατότητα να παρακολουθήσω την εξέλιξη ενός CREATE INDEX statement αρκεί πριν από την εκτέλεση του να εκτελέσω την SET STATISTICS PROFILE ON

Κατά την εκτέλεση του CREATE INDEX σε ένα άλλο Query Window μπορώ να εκτελώ το παρακάτω query το οποίο κάνει χρήση της παραπάνω DMV (καλό είναι πρώτα να δείτε τα BOL για αυτή στο link

Δεν μας ενδιαφέρουν όλα τα πεδία για την δημιουργία του index αλλά μόνο όσα αναφέρω στο query παρακάτω.


img1

Αυτό που όμως είναι χρήσιμο να γνωρίζουμε για μπορούμε να κατανοήσουμε τα αποτελέσματα του είναι οι τιμές που θα εμφανιστούν το πεδίο physical_operator_name και οι οποίες για την δημιουργία του index αυτές που μας ενδιαφέρουν είναι οι:

TABLE SCAN / CLUSTER INDEX SCAN που σημαίνει ότι είναι στην φάση που διαβάζει όλες τι γραμμές του πίνακα στον οποίο φτιάχνουμε το index.

SORT που σημαίνει ότι είναι στην φάση που ταξινομεί τα δεδομένα του index

INDEX INSERT είναι στην φάση που κάνει insert τα rows στην περίπτωση που φτιάχνουμε clustered index. Parallelism δείχνει τον παραλληλισμό της εργασίας.

Επειδή μια τέτοια εργασία πάντα παραλληλίζει αυτό που κάνουμε είναι κάνουμε κάποιο grouping ώστε να έχουμε summarized data όπως παρακάτω.


img2
declare @sessionid int = 56 -- change the value with your session id
select   
       node_id,
       physical_operator_name, 
       sum(row_count) as row_count, 
       sum(estimate_row_count) as estimate_row_count,
       cast(sum(row_count)*100 as float)/sum(estimate_row_count) as estimate_percent_complete
from sys.dm_exec_query_profiles   
where session_id=@sessionid  
group by node_id,physical_operator_name  
order by node_id desc;

//antonch


Ημερομηνία: 10 February 2018 01:05
Αξιολόγηση: ( 1 )
Κατηγορίες:
Share it:

Αφήστε το σχόλιο σας - Leave your comment

Τα σχόλια έχουν κλείσει.
Επιτρέπονται μόνο τα σχόλια από τα μέλη του SqlSchool.gr.


newsletter subscription

Εάν επιθυμείτε να λαμβάνετε ενημέρωση από εμάς, δώστε μας το e-mail σας.
PASS chapter logo
Official Professional Association for SQL Server (PASS) chapter for Greece
Join to PASS