Όσοι από εμάς έχουν περάσει ή είναι 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 παρακάτω.
Αυτό που όμως είναι χρήσιμο να γνωρίζουμε για μπορούμε να κατανοήσουμε τα αποτελέσματα του είναι οι τιμές που θα εμφανιστούν το πεδίο physical_operator_name και οι οποίες για την δημιουργία του index αυτές που μας ενδιαφέρουν είναι οι:
TABLE SCAN / CLUSTER INDEX SCAN που σημαίνει ότι είναι στην φάση που διαβάζει όλες τι γραμμές του πίνακα στον οποίο φτιάχνουμε το index.
SORT που σημαίνει ότι είναι στην φάση που ταξινομεί τα δεδομένα του index
INDEX INSERT είναι στην φάση που κάνει insert τα rows στην περίπτωση που φτιάχνουμε clustered index.
Parallelism δείχνει τον παραλληλισμό της εργασίας.
Επειδή μια τέτοια εργασία πάντα παραλληλίζει αυτό που κάνουμε είναι κάνουμε κάποιο grouping ώστε να έχουμε summarized data όπως παρακάτω.
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