Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:✅ Warehouse in Microsoft Fabric
Als het ongebruikelijk lang duurt voordat uw query's in Warehouse worden uitgevoerd of als ze vastlopen, is een mogelijke oorzaak het vergrendelen. Vergrendelen treedt op wanneer een sessie een vergrendeling bevat die voorkomt dat andere query's verdergaan.
In dit artikel wordt beschreven hoe u kunt bepalen of vergrendeling van invloed is op uw werkbelasting en welke acties u kunt ondernemen.
Tip
Warehouse maakt gebruik van vergrendeling op tabelniveau. Elke DML-bewerking verkrijgt een vergrendeling voor de hele tabel, ongeacht het aantal rijen. Dit gedrag verschilt van SQL Server, dat ondersteuning biedt voor vergrendelingen op rij- en paginaniveau.
Prerequisites
- Een magazijn met actieve workloads.
- Lidmaatschap van de werkruimterol Viewer is de minimaal vereiste machtiging om de dynamische beheerweergaven (DMV's) in dit artikel op te vragen.
- Zie Verbindingen, sessies en aanvragen bewaken met DMV's voor meer informatie over het oplossen van problemen met DMV's.
Stap 1: Controleren of query's wachten op vergrendelingen
Begin met te controleren of er momenteel query’s op vergrendelingen wachten.
Voer de volgende query uit.
SELECT
request_session_id,
resource_type,
resource_description,
request_mode,
request_status
FROM sys.dm_tran_locks
WHERE request_status = 'WAIT';
Als de query rijen retourneert, wachten sommige sessies op resources die door andere sessies worden gehouden. Elke rij geeft een vergrendelingsaanvraag aan die momenteel niet kan worden verleend.
Tip
De sys.dm_tran_locks weergave kan een groot aantal rijen opleveren voor toegekende vergrendelingen. Filteren op request_status = 'WAIT' richt zich op de sessies die geblokkeerd zijn.
Stap 2: Geblokkeerde query's identificeren
Controleer vervolgens welke query's worden geblokkeerd en welke sessie deze blokkeert.
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;
Deze query retourneert:
- De sessie waarop de geblokkeerde query wordt uitgevoerd (
session_id) - De sessie blokkeert deze momenteel (
blocking_session_id) - Hoe lang er al wordt gewacht (
total_elapsed_time, in milliseconden) - Of de blokkerende sessie een geopende transactie heeft (
open_transaction_count)
Als een query aangeeft dat blocking_session_id niet nul is en open_transaction_count > 0, wacht deze op een andere sessie die een vergrendeling vasthoudt.
Stap 3: De blokkeringssessie zoeken
Als u wilt weten welke resource is vergrendeld, controleert u de vergrendelingen die momenteel door de blokkerende sessie worden aangehouden. Vervang de <blocking_session_id> in de volgende voorbeeldquery door een session_id die u eerder hebt geïdentificeerd:
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>;
Gebruik deze query om het volgende te bepalen:
- Op welke resources de blokkerende sessie momenteel vergrendelingen heeft. U kunt bijvoorbeeld
sys.objectsgebruiken om deresource_associated_entity_idte identificeren waar deresource_type = OBJECT. - De vergrendelingsmodus (bijvoorbeeld Exclusief (
X), Schema-Modification (Sch-M)) - Of de vergrendeling is gerelateerd aan een DDL-bewerking of statistiekenupdate (
UPDSTATS)
Note
Statistiekengerelateerde vergrendelingen (zoals die van UPDSTATS) worden ook weergegeven in sys.dm_tran_locks. Schema-Modification () en Exclusieve (Sch-MX) vergrendelingen zijn de meest voorkomende obstakels, maar elk vergrendelingstype kan een conflicterende aanvraag blokkeren (bijvoorbeeld Sch-S blokkenSch-M).
Stap 4: de eigenaar van de blokkerende transactie zoeken
In veel gevallen geeft u er mogelijk de voorkeur aan de eigenaar van de blokkerende transactie te vragen om COMMIT of ROLLBACK zijn of haar werk in plaats van de sessie te beëindigen. Overweeg structuren te gebruiken TRYCATCH voor foutafhandeling met COMMIT of ROLLBACK. Zie TRY...CATCH voor meer informatie.
U kunt de eigenaar en query identificeren die is gekoppeld aan de blokkeringssessie. Vervang een session_id die u eerder hebt geïdentificeerd door de <blocking_session_id> in de volgende voorbeeldquery:
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_nameis de eigenaar van de blokkeringssessie. -
program_nameis de toepassing die de sessie heeft gestart. DeDMS_userwaarde geeft de Fabric portalquery-editor aan. -
commandis de opdracht die momenteel wordt uitgevoerd.
Vervolgens kunt u contact opnemen met de eigenaar van de transactie om deze vast te leggen of terug te draaien, indien van toepassing.
Stap 5: Controleren of de blokkerende sessie inactief is of geen voortgang boekt
Een blokkerende sessie kan actief lijken, maar maakt in werkelijkheid geen voortgang.
Indicatoren van een niet-actieve of vastgelopen sessie zijn:
-
status = 'sleeping'geeft aan dat er geen actieve query wordt uitgevoerd. - Zoek naar een
last_request_start_timeaanvraag die aanzienlijk eerder is dan de huidige tijd, wat aangeeft dat er een open aanvraag met een lange levensduur is. - Zoek naar een
total_elapsed_timedie tussen opeenvolgende controles niet toeneemt, wat duidt op een vastgelopen sessie.
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>;
- Als de sessiestatus
sleepingenopen_transaction_count > 0is, heeft de sessie een open transactie zonder actieve query: de sessie houdt een vergrendeling vast zonder werk uit te voeren. - Als de sessie in
sys.dm_exec_requestswordt weergegeven entotal_elapsed_timetussen de controles blijft toenemen, is de sessie actief bezig. Het is misschien beter om te wachten tot de transactie is voltooid in plaats van deze te beëindigen en een terugdraaiactie af te dwingen.
Stap 6: Actie ondernemen om blokkeringen op te lossen
Note
Blokkeringssituaties worden vaak zelf opgelost zodra de blokkeringssessie de transactie heeft voltooid. Als uw workload de vertraging kan verdragen, is wachten de veiligste optie.
Als u downstreamquery's wilt deblokkeren, moet u overwegen of een blokkeringssessie de volgende kenmerken heeft:
- Heeft een geopende transactie
- Lijkt inactief of maakt geen voortgang
- Houdt een blokkeringsvergrendeling vast (bijvoorbeeld Exclusief (
X) ofSch-M)
Zo ja, dan kan een lid van de werkruimterol Beheerder een sessie beëindigen met behulp van:
KILL <session_id>;
Met de KILL opdracht wordt het volgende uitgevoerd:
- De sessie beëindigen
- Alle werkzaamheden die zijn uitgevoerd in de actieve transactie van die sessie terugdraaien
- De vergrendeling vrijgeven
- Downstreamquery's toestaan om door te gaan
Caution
Wanneer een sessie wordt beëindigd, worden alle niet-doorgevoerde werkzaamheden die door die sessie worden uitgevoerd, teruggedraaid. Met deze actie worden mogelijk gegevenswijzigingen ongedaan gemaakt die door de gebruiker of toepassing zijn aangebracht. Gebruik deze optie alleen als u zeker weet dat het beëindigen van de transactie geen negatieve invloed heeft op uw werkbelasting.
Stap 7: Toekomstige vergrendelingsproblemen voorkomen
Om vergelijkbare problemen te voorkomen:
- Vermijd expliciete transacties open te laten (
BEGIN TRANSACTIONzonder een corresponderendCOMMITofROLLBACK). - Houd transacties met een korte levensduur. Voer alleen de benodigde bewerkingen binnen de transactie uit.
- Altijd
COMMITofROLLBACKtransacties wanneer deze zijn voltooid. - DDL-bewerkingen (zoals
ALTER TABLE) plannen tijdens vensters met weinig verkeer.
Open transacties proactief bewaken met behulp van:
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;
Regelmatig open transacties bewaken en tussenkomen wanneer dit van toepassing is, helpt de kans op blokkerende ketens te verminderen.