Περιγραφή του SQL Server, ο αποκλεισμός οφείλεται κλειδώματα μεταγλώττισης

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 263889 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Περίληψη

Στον Microsoft SQL Server, μόνο ένα αντίγραφο του σχεδίου μια αποθηκευμένη διαδικασία είναι γενικά στο χώρο προσωρινής αποθήκευσης, κάθε φορά. Επιβολή αυτό απαιτεί σειριοποίησης ορισμένων τμημάτων της διαδικασίας κατάρτισης και αυτός ο συγχρονισμός πραγματοποιείται εν μέρει χρησιμοποιώντας κλειδώματα μεταγλώττισης. Εάν πολλές συνδέσεις εκτελούνται ταυτόχρονα την ίδια αποθηκευμένη διαδικασία και κλείδωμα μεταγλώττισης πρέπει να επιτυγχάνονται η αποθηκευμένη διαδικασία κάθε φορά που εκτελείται, διαδικασία συστήματος αναγνωριστικά (SPID) θα αρχίσει να αποκλείσετε μεταξύ ως κάθε προσπαθεί να αποκτήσει ένα κλείδωμα για αποκλειστική χρήση μεταγλώττισης του αντικειμένου.

Περισσότερες πληροφορίες

Αποθηκευμένη διαδικασία recompilation είναι μια εξήγηση για μεταγλώττιση κλειδώματα σε μια αποθηκευμένη διαδικασία ή το έναυσμα. Σε αυτήν την περίπτωση, η λύση είναι η μείωση ή εξάλειψη του recompiles. Για μια επεξήγηση των οι πιο κοινοί λόγοι που μπορεί να έχουν μια αποθηκευμένη διαδικασία για να μεταγλωττιστούν ξανά και ορισμένες χρήσιμες πληροφορίες στη μείωση της συχνότητας των recompiles, ανατρέξτε στο ακόλουθο άρθρο της Γνωσιακής Βάσης της Microsoft:
243586Αντιμετώπιση προβλημάτων αποθηκευμένη διαδικασία recompilation
Ένα άλλο σενάριο που πραγματοποιούνται μεταγλώττισης κλειδωμάτων είναι όταν ισχύουν οι ακόλουθες συνθήκες:
  • Ο χρήστης που εκτελεί την αποθηκευμένη διαδικασία δεν είναι ο κάτοχος της διαδικασίας.
  • Το όνομα της αποθηκευμένης διαδικασίας δεν είναι έγκυρο με το όνομα του κατόχου του αντικειμένου.
Για παράδειγμα, εάν ο χρήστης "dbo" κατέχει αντικείμενοDBO.mystoredprocκαι κάποιος άλλος χρήστης, "Harry", εκτελείται η αποθηκευμένη διαδικασία χρησιμοποιώντας την εντολή "exec mystoredproc," η αρχική cache αναζήτησης από αποτυγχάνει όνομα αντικειμένου διότι το αντικείμενο δεν είναι έγκυρο κατόχου. (Δεν είναι ακόμη γνωστή αν υπάρχει μια άλλη αποθηκευμένη διαδικασία με το όνομα Harry.mystoredproc. Επομένως, SQL Server δεν είστε σίγουροι ότι το σχέδιο προσωρινής αποθήκευσης για το dbo.mystoredproc είναι η σωστή εκτέλεση.) Στη συνέχεια SQL Server αποκτά ένα κλείδωμα για αποκλειστική χρήση μεταγλώττισης για τη διαδικασία και καθιστά παρασκευάσματα για τη μεταγλώττιση της διαδικασίας. Αυτό περιλαμβάνει την επίλυση το όνομα του αντικειμένου σε ένα αναγνωριστικό αντικειμένου. Πριν SQL Server δημιουργεί το σχέδιο, το SQL Server χρησιμοποιεί αυτό το Αναγνωριστικό αντικειμένου για την πραγματοποίηση μιας πιο ακριβούς αναζήτησης της μνήμης cache και να εντοπίσετε ένα σχέδιο μεταγλωττιστεί προηγουμένως ακόμη και χωρίς κάτοχο.

Εάν εντοπιστεί ένα υπάρχον σχέδιο, SQL Server χρησιμοποιεί εκ νέου το σχέδιο προσωρινής αποθήκευσης και μεταγλώττιση στην πραγματικότητα την αποθηκευμένη διαδικασία. Ωστόσο, η έλλειψη προσόντων κατόχου επιβάλλει SQL Server για να κάνετε μια δεύτερη αναζήτηση cache και να αποκτήσει ένα κλείδωμα για αποκλειστική χρήση μεταγλώττισης πριν το πρόγραμμα καθορίζει ότι το υπάρχον σχέδιο εκτέλεσης προσωρινής αποθήκευσης μπορεί να χρησιμοποιηθεί ξανά. Πώς θα αποκτήσετε το κλείδωμα και την εκτέλεση αναζητήσεων και άλλων εργασιών που είναι απαραίτητες για την επίτευξη αυτού του σημείου μπορεί να εμφανίσει μια καθυστέρηση για τα κλειδώματα μεταγλώττισης που οδηγεί σε αποκλεισμό. Αυτό είναι ιδιαίτερα true, εάν πολλοί χρήστες που δεν είστε κάτοχος της αποθηκευμένης διαδικασίας που εκτελείται ταυτόχρονα τη διαδικασία χωρίς να απαιτείται το όνομα του κατόχου. Να θυμάστε ότι ακόμα και αν δεν βλέπετε SPID αναμονή για κλείδωμα μεταγλώττισης, έλλειψη προσόντων κάτοχος μπορεί να προκαλέσει καθυστερήσεις στην εκτέλεση της αποθηκευμένης διαδικασίας και να προκαλέσει υπερβολικά υψηλή χρήση της CPU.

Η παρακάτω ακολουθία συμβάντων θα καταγράφονται σε ένα ίχνος Profiler διακομιστή SQL όταν παρουσιαστεί αυτό το ζήτημα. (Για να παρακολουθήσετε συμβάντα που σχετίζονται με το χώρο προσωρινής αποθήκευσης, πρέπει να ενεργοποιήσετε συμβάντα για προχωρημένους. Για να το κάνετε αυτό, κάντε κλικ στο κουμπίΕπιλογέςσχετικά με τηνΕργαλείαμενού και, στη συνέχεια, επιλέξτεΌλων των κλάσεων συμβάντων.)

Σύμπτυξη αυτού του πίνακαΑνάπτυξη αυτού του πίνακα
Η κλάση συμβάντωνΚείμενο
RPC: εκκίνησηmystoredproc
SP:CacheMissmystoredproc
SP:ExecContextHitmystoredproc
SP: εκκίνησηmystoredproc
......

SP:CacheMissΣυμβαίνει όταν αποτύχει η αναζήτηση cache με βάση το όνομα. Τα ακόλουθαSP:ExecContextHitδηλώνει ένα αντίστοιχο σχέδιο προσωρινής αποθήκευσης βρέθηκε τελικά στη μνήμη cache μετά το όνομα του αντικειμένου ασαφής επιλύθηκε με ένα αναγνωριστικό αντικειμένου. Ανάλογα με τις περιστάσεις,SP:CacheHitενδέχεται να εμφανιστεί αντί τηςSP:ExecContextHit.

Η λύση σε αυτό το πρόβλημα μανδάλωσης μεταγλώττισης είναι για να βεβαιωθείτε ότι οι αναφορές σε αποθηκευμένες διαδικασίες είναι αναγνωρισμένο κατόχου. (Αντί τουExec mystoredproc, χρησιμοποιήστε execDBO.mystoredproc.) Ενώ η ικανότητα του κατόχου είναι σημαντικά για λόγους απόδοσης, δεν έχετε να χορηγηθεί στην αποθηκευμένη διαδικασία με το όνομα της βάσης δεδομένων για να αποτρέψετε την αναζήτηση επιπλέον μνήμη cache.

Ο αποκλεισμός που προκαλείται από μεταγλώττισης κλειδώματα μπορεί να ανιχνευθεί χρησιμοποιώντας αποκλεισμού δέσμες ενεργειών, όπως αυτές που καθορίζονται στα ακόλουθα άρθρα της Γνωσιακής Βάσης της Microsoft:
251004INF: Τρόπος παρακολούθησης ο αποκλεισμός του SQL Server 7.0
271509INF: Τρόπος παρακολούθησης ο αποκλεισμός του SQL Server 2000
Ακολουθούν ορισμένα τυπικά χαρακτηριστικά της μεταγλώττισης αποκλεισμού που είναι δυνατό να παρατηρηθούν στο αποτέλεσμα του αποκλεισμού δέσμης ενεργειών:
  • lastwaittypeΤο SPID αποκλεισμένων και αποκλεισμού (συνήθως) είναι LCK_M_X (αποκλειστική) καιwaitresourceείναι της μορφής "ΚΑΡΤΈΛΑ: dbid:object_id[[ΜΕΤΑΓΛΏΤΤΙΣΗΣ]],"όπου"object_id"είναι το Αναγνωριστικό αντικειμένου της αποθηκευμένης διαδικασίας.
  • Έχετε προγράμματα αποκλεισμού αναδυόμενωνwaittype0x0000 εκτελέσιμες κατάστασης. Έχουν blockeeswaittype0x000e (αποκλειστικό κλείδωμα), κατάσταση σε αναστολή λειτουργίας.
  • Παρόλο που η διάρκεια του συμβάντος αποκλεισμού μπορεί να είναι μεγάλο, δεν υπάρχει καμία μεμονωμένη SPID που αποκλείει τα άλλα SPID για μεγάλο χρονικό διάστημα. Δεν υπάρχει διατοίχισης αποκλεισμού. Μόλις ολοκληρωθεί μία μεταγλώττισης, άλλο SPID αναλαμβάνει το ρόλο της κεφαλής αποκλεισμού αναδυόμενων παραθύρων για ένα αρκετά δευτερόλεπτα ή λιγότερο, και ούτω καθεξής.
Οι ακόλουθες πληροφορίες είναι από ένα στιγμιότυποsysprocessesκατά τη διάρκεια αυτού του είδους των αποκλεισμός:
   spid  blocked  waittype  waittime  lastwaittype  waitresource
   ----  -------  --------  --------  ------------  -------------------------
   
   221    29      0x000e    2141      LCK_M_X       TAB: 6:834102 [[COMPILE]]
   228    29      0x000e    2235      LCK_M_X       TAB: 6:834102 [[COMPILE]]
    29   214      0x000e    3937      LCK_M_X       TAB: 6:834102 [[COMPILE]]
    13   214      0x000e    1094      LCK_M_X       TAB: 6:834102 [[COMPILE]]
    68   214      0x000e    1968      LCK_M_X       TAB: 6:834102 [[COMPILE]]
   214     0      0x0000       0      LCK_M_X       TAB: 6:834102 [[COMPILE]]
Με τοwaitresourceστήλη ("6:834102"), 6 είναι το Αναγνωριστικό της βάσης δεδομένων και 834102 είναι το αναγνωριστικό του αντικειμένου. Πρέπει να γνωρίζετε ότι αυτό το Αναγνωριστικό αντικειμένου που ανήκει σε μια αποθηκευμένη διαδικασία, όχι σε έναν πίνακα (παρά τον τύπο κλειδώματος "TAB").

Σημειώσεις
  • Αν χρησιμοποιείτε το SQL Server 2005, πολλοί από τους πίνακες συστήματος από το SQL Server 2000 υλοποιούνται τώρα ως ένα σύνολο προβολών. Αυτές οι προβολές είναι γνωστές ως προβολές συμβατότητας και προορίζονται μόνο για λόγους συμβατότητας. Οι προβολές συμβατότητας εκθέτει τα ίδια μετα-δεδομένα που ήταν διαθέσιμη σε SQL Server 2000. Για περισσότερες πληροφορίες σχετικά με την αντιστοίχιση μεταξύ των πινάκων του συστήματος SQL Server 2000 και τις προβολές του συστήματος SQL Server 2005, ανατρέξτε στο θέμα "Αντιστοίχιση προβολές του SQL Server 2000 σύστημα πίνακες για SQL Server 2005 συστήματος" στον SQL Server 2005 Books Online.
  • Εάν το όνομα της αποθηκευμένης διαδικασίας αρχίζει με το πρόθεμα "sp_" και δεν είναι στην κύρια βάση δεδομένων, μπορείτε να δείτεSP:CacheMissπριν από τη μνήμη cache επισκέψεων για κάθε εκτέλεση, ακόμη και εάν κάτοχος-πληροίτε την αποθηκευμένη διαδικασία. Αυτό συμβαίνει επειδή το πρόθεμα sp_ λέει SQL Server ότι η αποθηκευμένη διαδικασία είναι ένα σύστημα αποθηκευμένη διαδικασία και συστήματος που είναι αποθηκευμένες διαδικασίες έχουν διαφορετικό όνομα ανάλυση κανόνες. (Η θέση "προτιμώμενο" είναι στην κύρια βάση δεδομένων.) Τα ονόματα των αποθηκευμένες διαδικασίες που δημιουργήθηκαν από το χρήστη δεν θα πρέπει να αρχίζει με "sp_".
  • Εάν μια διαδικασία αναγνωρισμένο κατόχου εκτελείται με μια διαφορετική υπόθεση από τη διαδικασία αναγνωρισμένο κατόχου δημιουργήθηκε ως, η διαδικασία αναγνωρισμένο κάτοχο να αποκτήσετε έναCacheMissή αίτηση κλειδώματος ΜΕΤΑΓΛΏΤΤΙΣΗΣ, αλλά τελικά να χρησιμοποιήσετε το σχέδιο προσωρινής αποθήκευσης. Επομένως, αυτό θα μεταγλωττίζει πράγματι τη διαδικασία και δεν πρέπει να προκαλεί μεγάλο μέρος μια επιβάρυνση. Ωστόσο, σε ορισμένες περιπτώσεις, η αίτηση για κλείδωμα ΜΕΤΑΓΛΏΤΤΙΣΗΣ μπορεί να προκαλέσει μια κατάσταση "Αποκλεισμός αλυσίδα", εάν υπάρχουν πολλές SPID επιχειρεί να εκτελέσει την ίδια διαδικασία με μια διαφορετική υπόθεση από τη διαδικασία που είχε δημιουργηθεί ως. Αυτό ισχύει ανεξάρτητα από τη σειρά ταξινόμησης ή συρραφής που χρησιμοποιείται στο διακομιστή ή τη βάση δεδομένων. Ο λόγος για αυτήν τη συμπεριφορά είναι ότι ο αλγόριθμος που χρησιμοποιείται για να βρείτε τη διαδικασία στο χώρο προσωρινής αποθήκευσης βασίζεται σε τιμές κλειδιού κατακερματισμού (για λόγους απόδοσης), τα οποία μπορεί να αλλάξει αν η περίπτωση είναι διαφορετική.

    Η λύση είναι να αποθέσετε και να δημιουργήσετε τη διαδικασία με την ίδια περίπτωση με τη διαδικασία που εκτελείται από την εφαρμογή. Μπορείτε επίσης να βεβαιωθείτε ότι η διαδικασία που εκτελείται από όλες τις εφαρμογές που χρησιμοποιούν την ίδια περίπτωση.
  • Εάν προσπαθήσετε να εκτελέσετε μια αποθηκευμένη διαδικασία ως συμβάν γλώσσα αντί ως μια RPC, SQL Server πρέπει να αναλύσει και να μεταγλωττίζετε το ερώτημα συμβάντος γλώσσα, να καθορίσει ότι το ερώτημα προσπαθεί να εκτελέσει τη συγκεκριμένη διαδικασία, και στη συνέχεια, προσπαθήστε να βρείτε ένα σχέδιο στο χώρο προσωρινής αποθήκευσης για το καθεστώς αυτό. Για να αποφύγετε αυτήν την κατάσταση στην οποία SQL Server πρέπει να αναλύσει και να μεταγλωττίσετε το συμβάν γλώσσας, βεβαιωθείτε ότι το ερώτημα αποστέλλεται σε SQL ως ένα RPC.

    Για περισσότερες πληροφορίες, ανατρέξτε στην ενότητα "Σύστημα αποθηκευμένες διαδικασίες" στα ηλεκτρονικά βιβλία άρθρο "Δημιουργία μια αποθηκευμένη διαδικασία".


Γνωστά ζητήματα

Υπάρχουν ορισμένα γνωστά θέματα που μπορεί να εμποδίζει την προσωρινή αποθήκευση του σχεδίου:
  • Μπορείτε να χρησιμοποιήσετε μεταβλητές αντικειμένων BLOB ως παράμετρος μια αποθηκευμένη διαδικασία. Για περισσότερες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft:
    2380435ΕΠΙΔΙΌΡΘΩΣΗ: Το σχέδιο ερωτήματος για μια αποθηκευμένη διαδικασία είναι προσωρινά, εάν η αποθηκευμένη διαδικασία χρησιμοποιεί μια μεταβλητή BLOB και χρησιμοποιείται η μεταβλητή σε μια συνάρτηση συμβολοσειρά στον Microsoft SQL Server 2008
  • Μπορείτε να χρησιμοποιήσετε ΆΝΟΙΓΜΑ ΣΥΜΜΕΤΡΙΚΟΎ ΚΛΕΙΔΙΟΎ σε μια μαζική διαδικασία/ερώτημα είναι αποθηκευμένα. Για περισσότερες πληροφορίες, δείτε την ακόλουθη καταχώρηση ιστολογίου MSDN:
    http://blogs.MSDN.com/b/sqlserverfaq/Archive/2010/09/08/Open-Symmetric-Key-Command-prevents-Query-Plan-caching.aspx

Ιδιότητες

Αναγν. άρθρου: 263889 - Τελευταία αναθεώρηση: Πέμπτη, 27 Ιανουαρίου 2011 - Αναθεώρηση: 3.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL Server 2005 Workgroup Edition
Λέξεις-κλειδιά: 
kbinfo kbmt KB263889 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:263889

Αποστολή σχολίων

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com