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

Έχουν δημοσιευτεί 03 Ιανουαρίου 07 10:53 πμ | KelMan 

Το βασικότερο βήμα κατά την εκτέλεση ενός 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.

 


 

Δημοσίευση στην κατηγορία:

Σχόλια:

Χωρίς Σχόλια
Έχει απενεργοποιηθεί η προσθήκη σχολίων από ανώνυμα μέλη

Search

Go

Συνδρομές