Σημείωμα
Η πρόσβαση σε αυτήν τη σελίδα απαιτεί εξουσιοδότηση. Μπορείτε να δοκιμάσετε να εισέλθετε ή να αλλάξετε καταλόγους.
Η πρόσβαση σε αυτήν τη σελίδα απαιτεί εξουσιοδότηση. Μπορείτε να δοκιμάσετε να αλλάξετε καταλόγους.
Ισχύει για:✅ Warehouse στο Microsoft Fabric
Εάν τα ερωτήματά σας στο Warehouse χρειάζονται ασυνήθιστα πολύ χρόνο για να εκτελεστούν ή φαίνονται κολλημένα, μια πιθανή αιτία είναι το κλείδωμα. Το κλείδωμα συμβαίνει όταν μια συνεδρία διατηρεί ένα κλείδωμα που εμποδίζει τη συνέχιση άλλων ερωτημάτων.
Αυτό το άρθρο σάς δείχνει πώς μπορείτε να προσδιορίσετε εάν το κλείδωμα επηρεάζει τον φόρτο εργασίας σας και ποιες ενέργειες μπορείτε να κάνετε.
Συμβουλή
Η αποθήκη χρησιμοποιεί κλείδωμα σε επίπεδο τραπεζιού. Οποιαδήποτε λειτουργία DML αποκτά ένα κλείδωμα σε ολόκληρο τον πίνακα, ανεξάρτητα από το πόσες σειρές επηρεάζονται. Αυτή η συμπεριφορά διαφέρει από τον SQL Server, ο οποίος υποστηρίζει κλειδώματα σε επίπεδο γραμμών και σε επίπεδο σελίδας.
Προαπαιτούμενα
- Μια αποθήκη με ενεργό φόρτο εργασίας.
- Η ιδιότητα μέλους στον ρόλο χώρου εργασίας Viewer είναι το ελάχιστο δικαίωμα υποβολής ερωτημάτων στις προβολές δυναμικής διαχείρισης (DMV) σε αυτό το άρθρο.
- Για περισσότερες πληροφορίες σχετικά με την αντιμετώπιση προβλημάτων με DMV, ανατρέξτε στο θέμα Παρακολούθηση συνδέσεων, περιόδων λειτουργίας και αιτήσεων με χρήση DMV.
Βήμα 1: Ελέγξτε εάν τα ερωτήματα περιμένουν σε κλειδαριές
Ξεκινήστε ελέγχοντας εάν υπάρχουν ερωτήματα που περιμένουν αυτήν τη στιγμή στις κλειδαριές.
Εκτελέστε το ακόλουθο ερώτημα:
SELECT
request_session_id,
resource_type,
resource_description,
request_mode,
request_status
FROM sys.dm_tran_locks
WHERE request_status = 'WAIT';
Εάν το ερώτημα επιστρέψει γραμμές, ορισμένες περίοδοι λειτουργίας βρίσκονται σε αναμονή σε πόρους που διατηρούνται από άλλες περιόδους λειτουργίας. Κάθε σειρά υποδεικνύει ένα αίτημα κλειδώματος που δεν μπορεί να χορηγηθεί αυτήν τη στιγμή.
Συμβουλή
Η sys.dm_tran_locks προβολή μπορεί να επιστρέψει μεγάλο αριθμό γραμμών για παραχωρημένα κλειδώματα. Το φιλτράρισμα κατά request_status = 'WAIT' εστιάζει στις περιόδους λειτουργίας που έχουν αποκλειστεί.
Βήμα 2: Εντοπισμός αποκλεισμένων ερωτημάτων
Στη συνέχεια, ελέγξτε ποια ερωτήματα έχουν αποκλειστεί και ποια περίοδος λειτουργίας τα αποκλείει.
SELECT
session_id,
status,
blocking_session_id,
wait_type,
total_elapsed_time,
open_transaction_count
FROM sys.dm_exec_requests
WHERE blocking_session_id <> 0;
Αυτό το ερώτημα επιστρέφει:
- Η περίοδος λειτουργίας που εκτελεί το αποκλεισμένο ερώτημα (
session_id) - Η περίοδος λειτουργίας που το αποκλείει αυτήν τη στιγμή (
blocking_session_id) - Πόση ώρα περιμένει (
total_elapsed_time, σε χιλιοστά του δευτερολέπτου) - Αν η περίοδος λειτουργίας αποκλεισμού έχει ανοιχτή συναλλαγή (
open_transaction_count)
Εάν ένα ερώτημα εμφανίζεται blocking_session_id ως μη μηδενικό και open_transaction_count > 0, βρίσκεται σε αναμονή για μια άλλη περίοδο λειτουργίας που διατηρεί ένα κλείδωμα.
Βήμα 3: Βρείτε τη συνεδρία αποκλεισμού
Για να κατανοήσετε ποιος πόρος είναι κλειδωμένος, ελέγξτε τα κλειδώματα που διατηρούνται αυτήν τη στιγμή από την περίοδο λειτουργίας αποκλεισμού. Αντικαταστήστε ένα session_id που προσδιορίσατε νωρίτερα με το <blocking_session_id> παρακάτω δείγμα ερωτήματος:
SELECT
request_session_id,
resource_type,
resource_associated_entity_id,
request_mode,
request_status
FROM sys.dm_tran_locks
WHERE
request_status = 'GRANT'
AND request_session_id = <blocking_session_id>;
Χρησιμοποιήστε αυτό το ερώτημα για να προσδιορίσετε:
- Οι πόροι στους οποίους διατηρείται η περίοδος λειτουργίας αποκλεισμού κλειδώνουν αυτήν τη στιγμή. Για παράδειγμα, μπορείτε να χρησιμοποιήσετε
sys.objectsτο για να προσδιορίσετε πούresource_associated_entity_idβρίσκεται τοresource_type = OBJECTαρχείο . - Η λειτουργία κλειδώματος (για παράδειγμα, Αποκλειστικό (
X), Schema-Modification (Sch-M)) - Αν η κλειδαριά σχετίζεται με λειτουργία DDL ή ενημέρωση στατιστικών στοιχείων (
UPDSTATS)
Σημείωμα
Οι κλειδαριές που σχετίζονται με στατιστικά στοιχεία (όπως αυτές από UPDSTATSτο ) εμφανίζονται επίσης στο sys.dm_tran_locks. Οι κλειδαριές Schema-Modification (Sch-M) και Exclusive (X) είναι οι πιο συνηθισμένοι αποκλεισμοί, αλλά οποιοσδήποτε τύπος κλειδαριάς μπορεί να αποκλείσει ένα αίτημα σε διένεξη (για παράδειγμα, Sch-S μπλοκ Sch-M).
Βήμα 4: Βρείτε τον κάτοχο της συναλλαγής αποκλεισμού
Σε πολλές περιπτώσεις, μπορεί να προτιμάτε να ρωτήσετε τον κάτοχο της συναλλαγής αποκλεισμού ή ROLLBACK την εργασία του αντί να COMMIT τερματίσετε τη συνεδρία. Εξετάστε το ενδεχόμενο να χρησιμοποιήσετε TRYCATCH δομές για χειρισμό σφαλμάτων με COMMIT ή ROLLBACK. Για περισσότερες πληροφορίες, ανατρέξτε στην ενότητα ΔΟΚΙΜΑΣΤΕ... ΑΛΊΕΥΣΗ.
Μπορείτε να προσδιορίσετε τον κάτοχο και το ερώτημα που σχετίζεται με την περίοδο λειτουργίας αποκλεισμού. Αντικαταστήστε ένα session_id που προσδιορίσατε νωρίτερα με το <blocking_session_id> παρακάτω δείγμα ερωτήματος:
SELECT
r.session_id,
s.login_name,
s.program_name,
r.status,
r.blocking_session_id,
r.command,
r.total_elapsed_time,
s.last_request_start_time,
s.last_request_end_time
FROM sys.dm_exec_requests r
JOIN sys.dm_exec_sessions s
ON r.session_id = s.session_id
WHERE r.session_id = <blocking_session_id>;
-
login_nameείναι ο κάτοχος της περιόδου λειτουργίας αποκλεισμού. -
program_nameείναι η εφαρμογή που ξεκίνησε τη συνεδρία. ΗDMS_userτιμή υποδεικνύει το πρόγραμμα επεξεργασίας ερωτημάτων πύλης Fabric. -
commandείναι η εντολή που εκτελείται αυτήν τη στιγμή.
Στη συνέχεια, μπορείτε να επικοινωνήσετε με τον κάτοχο της συναλλαγής για να τη δεσμεύσετε ή να την επαναφέρετε, εάν χρειάζεται.
Βήμα 5: Ελέγξτε εάν η περίοδος αποκλεισμού είναι αδρανής ή δεν προχωρά
Μια περίοδος λειτουργίας αποκλεισμού μπορεί να φαίνεται ενεργή, αλλά στην πραγματικότητα δεν σημειώνει πρόοδο.
Οι δείκτες μιας περιόδου λειτουργίας σε αδράνεια ή διακοπή περιλαμβάνουν:
-
status = 'sleeping'υποδεικνύει ότι δεν εκτελείται ενεργό ερώτημα. - Αναζητήστε ένα
last_request_start_timeπου είναι σημαντικά νωρίτερα από την τρέχουσα ώρα, υποδεικνύοντας ένα μακροχρόνιο ανοιχτό αίτημα. - Αναζητήστε ένα
total_elapsed_timeπου δεν αυξάνεται μεταξύ των ελέγχων, υποδεικνύοντας μια περίοδο λειτουργίας που έχει σταματήσει.
SELECT
session_id,
status,
last_request_start_time,
last_request_end_time,
open_transaction_count
FROM sys.dm_exec_sessions
WHERE session_id = <blocking_session_id>;
- Εάν η κατάσταση της συνεδρίας είναι
sleepingκαιopen_transaction_count > 0, η περίοδος λειτουργίας έχει μια ανοιχτή συναλλαγή χωρίς ενεργό ερώτημα - διατηρεί ένα κλείδωμα χωρίς να κάνει εργασία. - Αν η περίοδος λειτουργίας εμφανίζεται και
sys.dm_exec_requeststotal_elapsed_timeσυνεχίζει να αυξάνεται μεταξύ των ελέγχων, η περίοδος λειτουργίας εξελίσσεται ενεργά. Ίσως είναι προτιμότερο να περιμένετε να ολοκληρωθεί η συναλλαγή αντί να την τερματίσετε και να αναγκάσετε την επαναφορά.
Βήμα 6: Λάβετε μέτρα για να επιλύσετε τον αποκλεισμό
Σημείωμα
Οι καταστάσεις αποκλεισμού συχνά επιλύονται από μόνες τους μόλις η περίοδος αποκλεισμού ολοκληρώσει τη συναλλαγή της. Εάν ο φόρτος εργασίας σας μπορεί να ανεχθεί την καθυστέρηση, η αναμονή είναι η ασφαλέστερη επιλογή.
Εάν πρέπει να καταργήσετε τον αποκλεισμό μεταγενέστερων ερωτημάτων, εξετάστε εάν μια περίοδος λειτουργίας αποκλεισμού έχει τα ακόλουθα χαρακτηριστικά:
- Έχει ανοιχτή συναλλαγή
- Εμφανίζεται αδρανές ή δεν προχωρά
- Κρατάει μια κλειδαριά φραγής (για παράδειγμα, Αποκλειστική (
X) ήSch-M)
Σε αυτήν την περίπτωση, ένα μέλος του ρόλου χώρου εργασίας διαχειριστή μπορεί να τερματίσει μια περίοδο λειτουργίας χρησιμοποιώντας:
KILL <session_id>;
Η KILL εντολή θα:
- Τερματισμός της συνεδρίας
- Επαναφορά όλης της εργασίας που έχει γίνει στην ενεργή συναλλαγή αυτής της περιόδου λειτουργίας
- Απελευθερώστε την κλειδαριά
- Να επιτρέπεται η συνέχιση των ερωτημάτων κατάντη
Προσοχή
Η ακύρωση μιας συνεδρίας επαναφέρει όλη την αδέσμευτη εργασία που εκτελέστηκε από αυτήν τη συνεδρία. Αυτή η ενέργεια μπορεί να αναιρέσει τις αλλαγές δεδομένων που έγιναν από τον χρήστη ή την εφαρμογή. Χρησιμοποιήστε αυτήν την επιλογή μόνο όταν είστε βέβαιοι ότι ο τερματισμός της συναλλαγής δεν επηρεάζει αρνητικά τον φόρτο εργασίας σας.
Βήμα 7: Αποτρέψτε μελλοντικά προβλήματα κλειδώματος
Για να αποτρέψετε παρόμοια προβλήματα:
- Αποφύγετε να αφήνετε ανοιχτές ρητές συναλλαγές (
BEGIN TRANSACTIONχωρίς αντίστοιχοCOMMITήROLLBACK). - Διατηρήστε τις συναλλαγές βραχύβιες. Εκτελέστε μόνο τις απαραίτητες λειτουργίες εντός της συναλλαγής.
- Πάντα
COMMITήROLLBACKσυναλλαγές όταν ολοκληρωθούν. - Προγραμματίστε λειτουργίες DDL (όπως
ALTER TABLE) κατά τη διάρκεια παραθύρων χαμηλής κυκλοφορίας.
Παρακολουθήστε προληπτικά τις ανοιχτές συναλλαγές χρησιμοποιώντας:
SELECT
session_id,
login_name,
open_transaction_count,
program_name,
status,
blocking_session_id,
last_request_start_time
FROM sys.dm_exec_sessions
WHERE open_transaction_count > 0;
Η τακτική παρακολούθηση των ανοιχτών συναλλαγών και η παρέμβαση όταν χρειάζεται συμβάλλει στη μείωση της πιθανότητας σχηματισμού αλυσίδων αποκλεισμού.