Query Plan Guides: Η εκδίκηση του DBA


Το βασικότερο βήμα κατά την εκτέλεση ενός query στον SQL Server είναι η δημιουργία του execution plan, δηλαδή ο καθορισμός του τρόπου που θα γίνουν access τα δεδομένα (χονδρικά, τι indexes θα χρησιμοποιηθούν και πως). Η δημιουργία του execution plan είναι μια περίπλοκη διαδικασία που υλοποιείται από το query engine λαμβάνοντας υπόψη διάφορους παράγοντες με έναν μηχανισμό που ονομάζεται cost-based query optimization. Ο query optimizer βελτιώνεται διαρκώς όχι μόνο από έκδοση σε έκδοση στον SQL Server αλλά ακόμη και από SP σε SP καθώς το development team του SQL Server έχει ειδικές συμφωνίες με μεγάλους πελάτες που παρέχουν πραγματικά δεδομένα και σχετικά traces για το πώς αυτά χρησιμοποιούνται.

Ήδη από την έκδοση 2000 του SQL Server, ο query optimizer είναι πολύ αποτελεσματικός και σχεδόν πάντοτε προτείνει το βέλτιστο execution plan. Εντούτοις, πολλοί developers, για διάφορους λόγους, θεωρούν ότι πρέπει να υποχρεώσουν τον SQL Server να εκτελέσει κάποιο query με συγκεκριμένο τρόπο, επιβάλλοντας δηλαδή συγκεκριμένα indexes ή συγκεκριμένα είδη joins – τα λεγόμενα «HINTS». Όπως αναφέρουν και τα Books On Line, τα query hints θα πρέπει να χρησιμοποιούνται μόνο εφόσον υπάρχει πολύ καλή και δικαιολογημένη αιτία και έχοντας υπόψη ότι ανά πάσα στιγμή ενδέχεται να χρειαστεί να σταματήσει η χρήση τους καθώς η αλλαγές στη φύση των δεδομένων μπορεί να έχει καταστήσει το query hint τελείως ακατάλληλο. Το πρόβλημα είναι ότι πολλές φορές, οι developers γράφουν εφαρμογές που χρησιμοποιούν query hints και πλέον είναι εξαιρετικά δύσκολο να αλλάξει το query.

Στον SQL Server 2005 υπάρχει τρόπος να αλλάξει ένα query (ως προς τα hints) χωρίς να πειραχθεί η εφαρμογή που το στέλνει, δηλαδή να γίνει override κατά κάποιο τρόπο. Αυτό μπορεί να γίνει με τα Plan Guides. Κάθε query που θέλουμε να κάνουμε override, αποθηκεύεται σε έναν εσωτερικό system table μαζί με το αντίστοιχο υποκατάστατό του. Η διαδικασία αυτή γίνεται μέσω δύο stored procedures, της sp_create_plan_guide και sp_control_plan_guide ενώ τα αποθηκευμένα Plan Guides φαίνονται σε ένα system catalog view που ονομάζεται sys.plan_guides.

Για παράδειγμα, δημιουργούμε ένα Plan Guide:

sp_create_plan_guide
@name = N'PlanGuide1',
@stmt = N'SELECT COUNT(*) AS Total FROM Sales.SalesOrderHeader h, Sales.SalesOrderDetail d WHERE h.SalesOrderID = d.SalesOrderID and h.OrderDate BETWEEN ''1/1/2000'' AND ''1/1/2005'' ',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (MERGE JOIN)'
GO

Χρειάζεται προσοχή ώστε το SQL statement να είναι ακριβώς όπως το λαμβάνει ο server. Γι αυτό χρησιμοποιούμε τον Profiler τόσο για το statement (@stmt) όσο και για τις παραμέτρους (@params). Κατόπιν, μπορούμε να το ενεργοποιήσουμε, να το απενεργοποιήσουμε, να το κάνουμε drop, κλπ με την sp_control_plan_guide:

sp_control_plan_guide N'DROP', N'PlanGuide1'

Τα Plan Guides έχουν πολλές εφαρμογές. Πέρα από το παράδειγμα που ανέφερα, μπορούν να χρησιμοποιηθούν πολύ έξυπνα μαζί με τα OPTIMIZE FOR ή RECOMPILE query hints καθώς και για να αλλάξει συμπεριφορά σε queries που παίζουν με parallel execution plans. Πρακτικά, μπορούν να χρησιμοποιηθούν σε όλες τις εκδόσεις του SQL Server 2005 εκτός από την Express και τη Workgroup.

Πολλά περισσότερα για τα παραπάνω μπορείτε να βρείτε στο http://www.microsoft.com/technet/prodtechnol/sql/2005/frcqupln.mspx όπου υπάρχει και ένα πολύ καλό technical article σε word format για να κάνετε download.

Advertisements


Σχολιάστε

Εισάγετε τα παρακάτω στοιχεία ή επιλέξτε ένα εικονίδιο για να συνδεθείτε:

Λογότυπο WordPress.com

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό WordPress.com. Αποσύνδεση / Αλλαγή )

Φωτογραφία Twitter

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Twitter. Αποσύνδεση / Αλλαγή )

Φωτογραφία Facebook

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Facebook. Αποσύνδεση / Αλλαγή )

Φωτογραφία Google+

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Google+. Αποσύνδεση / Αλλαγή )

Σύνδεση με %s