Τρόπος επίλυσης αποκλεισμού προβλήματα που προκαλούνται από κλείδωμα κλιμάκωσης στον SQL Server

Σύνοψη

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

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

Τρόπος διαπίστωσης αν κλιμάκωση κλείδωμα προκαλεί αποκλεισμό

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

Εάν υφίσταται κλειδώματος κλιμάκωση, βεβαιωθείτε ότι το κλείδωμα πίνακα αναχθεί αποκλείει άλλους χρήστες.

Για περισσότερες πληροφορίες σχετικά με τον τρόπο προσδιορισμού της κεφαλής αποκλεισμού αναδυόμενων παραθύρων και την αναγνώριση του πόρου κλείδωμα που κατέχει η κεφαλή αποκλεισμού αναδυόμενων παραθύρων που αποκλείει άλλη διεργασία διακομιστή αναγνωριστικά (SPID), κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft:

224453 κατανόηση και επίλυση του SQL Server 7.0 ή 2000 αποκλεισμού προβλημάτων

Εάν το κλείδωμα που αποκλείει άλλους χρήστες είναι οτιδήποτε άλλο εκτός από το κλείδωμα ΚΑΡΤΈΛΑ (επίπεδο πίνακα) με μια κατάσταση κλειδώματος του S (κοινόχρηστο) ή X (αποκλειστική), κλείδωμα κλιμάκωση δεν είναι το ζήτημα. Ειδικότερα, εάν η ΚΑΡΤΈΛΑ κλείδωμα είναι ένα κλείδωμα πρόθεσης (όπως μια κατάσταση κλειδώματος ΕΊΝΑΙ, IU ή IX), αυτό δεν είναι το αποτέλεσμα του κλειδώματος κλιμάκωση. Εάν τα προβλήματα αποκλεισμού δεν προκαλούνται από κλείδωμα κλιμάκωσης, ανατρέξτε στο άρθρο Q224453 για τα βήματα αντιμετώπισης προβλημάτων.

Πώς να αποτρέψετε την κλιμάκωση κλειδώματος

Ο απλούστερος και ασφαλέστερος τρόπος για να αποτρέψετε την κλιμάκωση lock είναι να διατηρήσετε σύντομη συναλλαγές και να μειώσετε το αποτύπωμα κλείδωμα δαπανηρή ερωτημάτων, έτσι ώστε τα κατώτατα όρια κλιμάκωση κλείδωμα δεν σημειώνεται υπέρβαση. Υπάρχουν πολλοί τρόποι για να αποκτήσετε αυτόν το στόχο, πολλές από τις οποίες αναγράφονται:
  • Χωρίστε τις λειτουργίες δέσμης μεγάλο σε πολλά μικρότερα λειτουργίες. Για παράδειγμα, ας υποθέσουμε ότι εκτελέσατε το παρακάτω ερώτημα για να καταργήσετε πολλά χίλια εννιακόσια παλιές εγγραφές από έναν πίνακα ελέγχου και, στη συνέχεια, βρέθηκε ότι προκαλείται ένα κλείδωμα κλιμάκωσης που αποκλείονται άλλους χρήστες:
    DELETE FROM LogMessages WHERE LogDate < '2/1/2002'
    Με την κατάργηση αυτών των καρτελών μερικές εκατοντάδες κάθε φορά, μπορείτε να μειώσετε σημαντικά τον αριθμό των κλειδωμάτων που συσσωρεύονται ανά συναλλαγή και να αποτρέψετε την κλιμάκωση κλειδώματος. Για παράδειγμα:
    SET ROWCOUNT 500delete_more:
    DELETE FROM LogMessages WHERE LogDate < '2/1/2002'
    IF @@ROWCOUNT > 0 GOTO delete_more
    SET ROWCOUNT 0
  • Μείωση του αποτυπώματος κλείδωμα του ερωτήματος, κάνοντας το ερώτημα να είναι όσο το δυνατόν πιο αποτελεσματική. Μεγάλο σαρώσεις ή μεγάλου αριθμού αναζητήσεις σελιδοδείκτη μπορεί να αυξήσει την πιθανότητα κλειδώματος κλιμάκωση; Επιπλέον, αυξάνει την πιθανότητα προβλήματα και γενικά επηρεάζει αρνητικά συνταύτιση και τις επιδόσεις. Αφού βρείτε το ερώτημα που προκαλεί κλείδωμα κλιμάκωση, αναζητήστε ευκαιρίες για τη δημιουργία νέων ευρετηρίων ή για να προσθέσετε στήλες σε ένα υπάρχον ευρετήριο για να καταργήσετε το ευρετήριο ή πίνακα σαρώσεις, καθώς και για τη μεγιστοποίηση της αποτελεσματικότητας του ευρετηρίου αναζητά. Εξετάστε το ενδεχόμενο επικόλληση το ερώτημα σε ένα παράθυρο ερωτήματος Query Analyzer για να εκτελέσετε μια ανάλυση Αυτόματο ευρετήριο σε αυτό. Για να το κάνετε αυτό, στο μενού ερώτημα , κάντε κλικ στην εντολή Οδηγός ρύθμισης ευρετήριο στον SQL Server 2000 ή κάντε κλικ στο κουμπί Εκτέλεση ανάλυσης ευρετηρίου στον SQL Server 7.0.

    Ένας στόχος του αυτή η βελτιστοποίηση είναι να κάνετε ευρετήριο επιδιώκει επιστροφή ως γραμμές όσο το δυνατό για να ελαχιστοποιήσετε το κόστος των αναζητήσεων σελιδοδείκτη (Μεγιστοποίηση της επιλεκτικότητας των το ευρετήριο για το συγκεκριμένο ερώτημα). Εάν ο SQL Server εκτιμά ότι ένα λογικό τελεστή σελιδοδείκτη αναζήτησης μπορεί να επιστρέψει πολλές γραμμές, ενδέχεται να μπορεί να χρησιμοποιήσει ένα ΠΡΟΦΌΡΤΩΣΗΣ για την πραγματοποίηση αναζήτησης σελιδοδείκτη. Εάν ο SQL Server χρησιμοποιεί ΠΡΟΦΌΡΤΩΣΗΣ για μια αναζήτηση σελιδοδείκτης, πρέπει να μπορεί να αυξηθεί το επίπεδο απομόνωσης συναλλαγής από ένα τμήμα του ερωτήματος για την επαναλαμβανόμενη ανάγνωση για ένα τμήμα του ερωτήματος. Αυτό σημαίνει ότι το τι μπορεί να μοιάζει με μια πρόταση SELECT σε επίπεδο απομόνωσης που διαπράχθηκαν ανάγνωση μπορεί να αποκτά πολλών χιλιάδων κλειδί κλειδώματα (στον συγκεντρωτικό ευρετήριο και ένα άλλο ευρετήριο), που μπορεί να προκαλέσει τέτοια ένα ερώτημα για να υπερβαίνει τα κατώτατα όρια κλιμάκωση κλειδώματος. Αυτό είναι ιδιαίτερα σημαντικό Εάν διαπιστώσετε ότι το κλείδωμα escalated είναι ένα κλείδωμα κοινόχρηστο πίνακα, η οποία, ωστόσο, δεν εμφανίζεται συνήθως στο προεπιλεγμένο επίπεδο απομόνωσης που διαπράχθηκαν ανάγνωση. Εάν έναν όρο αναζήτησης σελιδοδείκτη με ΠΡΟΦΌΡΤΩΣΗΣ προκαλεί την κλιμάκωση, εξετάστε το ενδεχόμενο προσθήκης επιπλέον στήλες σε μη συγκεντρωτικό ευρετήριο που εμφανίζεται στην το ευρετήριο αναζήτηση ή το ευρετήριο σάρωση λογικό τελεστή κάτω από τον λογικό τελεστή σελιδοδείκτη αναζήτησης στο σχέδιο ερωτήματος. Ενδέχεται να μπορείτε να δημιουργήσετε ένα ευρετήριο που καλύπτουν (ένα ευρετήριο που περιλαμβάνει όλες τις στήλες σε έναν πίνακα που χρησιμοποιήθηκαν στο ερώτημα), ή τουλάχιστον ένα ευρετήριο που καλύπτει τις στήλες που χρησιμοποιήθηκαν για κριτήρια συνδέσμου ή στον όρο WHERE εάν καθώς και όλα τα στοιχεία στη λίστα επιλέξτε τη στήλη δεν είναι εφικτή.

    Ένας σύνδεσμος βρόχου ένθετα μπορούν επίσης να χρησιμοποιούν ΠΡΟΦΌΡΤΩΣΗΣ και αυτό έχει ως αποτέλεσμα την ίδια συμπεριφορά κλειδώματος.

    Για περισσότερες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft:

    260652 Nested βρόχος συνδέσμου, ο οποίος χρησιμοποιεί ένα "ΣΕΛΙΔΟΔΕΊΚΤΗ ΑΝΑΖΉΤΗΣΗΣ... ΜΕ την ΠΡΟΣΚΌΜΙΣΗ"μπορούν να κατέχουν κλειδώματα περισσότερο

  • Κλείδωμα κλιμάκωσης δεν είναι δυνατό να προκύψει εάν διαφορετική SPID αυτήν τη στιγμή κατέχει ένα πίνακα συμβατό κλείδωμα. Πάντα κλείδωμα κλιμάκωση κλιμάκωση σε ένα κλείδωμα πίνακα και ποτέ σε σελίδα κλειδώματα. Επιπλέον, εάν μια προσπάθεια κλιμάκωση κλείδωμα αποτύχει, επειδή μια άλλη SPID διατηρεί ένα μη συμβατό κλείδωμα ΚΑΡΤΈΛΑ, το ερώτημα που επιχειρήθηκε κλιμάκωση δεν εμποδίζει κατά την αναμονή για κλείδωμα ΚΑΡΤΈΛΑ. Αντίθετα, συνεχίζει να αποκτήσει κλειδώματα στο αρχικό, πιο λεπτομερή επίπεδο (γραμμών, κλειδί ή σελίδα), επιχειρούν περιοδικά να κάνετε πρόσθετες κλιμάκωση. Κατά συνέπεια, μία μέθοδος για να αποτρέψετε το κλείδωμα κλιμάκωση σε ένα συγκεκριμένο πίνακα είναι να αποκτήσει και να κρατάτε ένα κλείδωμα σε μια διαφορετική σύνδεση που δεν είναι συμβατή με τον τύπο κλειδώματος αναχθεί. Ένα κλείδωμα IX (αποκλειστική πρόθεση) σε επίπεδο πίνακα δεν κλειδώνει τις γραμμές ή τις σελίδες, αλλά είναι ακόμα δεν είναι συμβατό με μια escalated S (κοινόχρηστο) ή X (αποκλειστική) ΚΑΡΤΈΛΑ κλειδώματος. Για παράδειγμα, ας υποθέσουμε ότι πρέπει να εκτελέσετε μια μαζική εργασία που τροποποιεί ένα μεγάλο αριθμό γραμμών στον πίνακα Πίνακας και που προκάλεσε ο αποκλεισμός που προκύπτει λόγω κλειδώματος κλιμάκωση. Εάν αυτή η εργασία ολοκληρώνεται πάντα σε λιγότερο από μία ώρα, μπορεί να δημιουργήσετε μια εργασία Transact-SQL που περιέχει τον ακόλουθο κώδικα και Προγραμματισμός νέας εργασίας για να ξεκινήσετε αρκετά λεπτά πριν από τη μαζική εργασία ώρα έναρξης:
    BEGIN TRANSELECT * FROM mytable (UPDLOCK, HOLDLOCK) WHERE 1=0
    WAITFOR DELAY '1:00:00'
    COMMIT TRAN
    Αυτό το ερώτημα αποκτά και διατηρεί ένα κλείδωμα IX Πίνακας επί μία ώρα, που αποτρέπει την κλιμάκωση κλειδώματος στον πίνακα κατά τη συγκεκριμένη στιγμή. Αυτή τη μαζική τροποποιείτε οποιαδήποτε δεδομένα ή αποκλεισμός άλλα ερωτήματα (εκτός και αν το άλλο ερώτημα επιβάλλει ένα κλείδωμα πίνακα με την υπόδειξη TABLOCK, ή εάν ένας διαχειριστής έχει απενεργοποιήσει κλειδώματα σελίδας ή γραμμή, χρησιμοποιώντας ένα sp_indexoption αποθηκευμένη διαδικασία).
Επιπλέον, μπορείτε να απενεργοποιήσετε την κλιμάκωση lock, δίνοντας τη δυνατότητα παρακολούθησης σημαία 1211. Ωστόσο, αυτήν τη σημαία παρακολούθησης απενεργοποιεί όλα κλείδωμα κλιμάκωση καθολικά στο η παρουσία του SQL Server. Κλείδωμα κλιμάκωση εξυπηρετεί ένα πολύ χρήσιμο σκοπό στον SQL Server μεγιστοποιώντας την αποτελεσματικότητα των ερωτημάτων που διαφορετικά επιβραδυνθούν προς τα κάτω από την επιβάρυνση απόκτηση και αφήνοντας αρκετές χιλιάδες κλειδωμάτων. Κλείδωμα κλιμάκωση βοηθά επίσης να ελαχιστοποιήσετε την απαιτούμενη μνήμη για την παρακολούθηση των κλειδωμάτων. Η μνήμη που μπορεί να εκχωρήσει δυναμικά το SQL Server για κλείδωμα δομές είναι περιορισμένη, έτσι εάν απενεργοποιήσετε το κλείδωμα κλιμάκωσης και μνήμη κλείδωμα μεγαλώνει αρκετά μεγάλη, επιχειρεί να εκχωρήσει πρόσθετα κλειδώματα για οποιοδήποτε ερώτημα ενδέχεται να αποτύχει και παρουσιάζεται το ακόλουθο μήνυμα λάθους:

Σφάλμα: 1204, σοβαρότητας: 19, κατάσταση: 1
Ο SQL Server δεν μπορεί να αποκτήσει ΚΛΕΊΔΩΜΑ πόρου αυτήν τη στιγμή. Εκτελέστε ξανά την πρόταση, όταν υπάρχουν λιγότερα ενεργοί χρήστες ή ζητήστε από το διαχειριστή του συστήματος για να ελέγξετε τις παραμέτρους SQL Server κλείδωμα και μνήμης.
Σημείωση Όταν παρουσιάζεται ένα σφάλμα "1204", διακόπτει την επεξεργασία της τρέχουσας πρότασης και έχει ως αποτέλεσμα μια επαναφορά της ενεργού συναλλαγής. Η επαναφορά ίδια ενδέχεται να εμποδίσει τους χρήστες ή να οδηγήσει σε μια μεγάλη βάση δεδομένων ανέλκυση Εάν κάνετε επανεκκίνηση της υπηρεσίας SQL Server.

Μόνο χρησιμοποιώντας μια υπόδειξη κλείδωμα όπως κλείδωμα ΓΡΑΜΜΏΝ αλλάζει το σχέδιο αρχικής κλειδώματος. Κλείδωμα υποδείξεις δεν εμποδίζουν την κλιμάκωση κλειδώματος.


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

Για να προσθέσετε μια παράμετρο εκκίνησης διακομιστή, κάντε δεξιό κλικ στο διακομιστή στο SQL Enterprise Manager, κάντε κλικ στο κουμπί Ιδιότητες, και, στη συνέχεια, στην καρτέλα Γενικά , κάντε κλικ στο κουμπί Παράμετροι εκκίνησηςκαι, στη συνέχεια, προσθέστε την ακόλουθη παράμετρο (ακριβώς όπως εμφανίζονται):
-T1211
Πρέπει να εναλλάσσετε την υπηρεσία SQL Server για μια νέα παράμετρο εκκίνησης για να τεθούν σε ισχύ. Εάν εκτελέσετε το παρακάτω ερώτημα στο Query Analyzer τη σημαία παρακολούθησης ενεργοποιείται αμέσως:
DBCC TRACEON (1211, -1)
Ωστόσο, εάν δεν προσθέσετε το -T1211 παράμετρο εκκίνησης, το αποτέλεσμα μιας εντολής traceon χάνεται κατά την ανακύκλωση της υπηρεσίας SQL Server. Ενεργοποιήσετε τη σημαία παρακολούθησης αποτρέπει τυχόν μελλοντικές κλείδωμα οι, αλλά αυτό δεν αναιρεί οποιεσδήποτε οι κλειδώματος που έχουν ήδη πραγματοποιηθεί σε ένα ενεργό συναλλαγή.
Ιδιότητες

Αναγνωριστικό άρθρου: 323630 - Τελευταία αναθεώρηση: 17 Ιαν 2017 - Αναθεώρηση: 1

Σχόλια