Muistiinpano
Tämän sivun käyttö edellyttää valtuutusta. Voit yrittää kirjautua sisään tai vaihtaa hakemistoa.
Tämän sivun käyttö edellyttää valtuutusta. Voit yrittää vaihtaa hakemistoa.
Sovellettavissa:✅ Varasto Microsoft Fabric
Jos Warehouse-kyselysi kestävät poikkeuksellisen kauan tai vaikuttavat jumissa, yksi mahdollinen syy on lukitus. Lukitus tapahtuu, kun istunto pitää lukittua, joka estää muiden kyselyiden etenemisen.
Tässä artikkelissa näytetään, miten voit selvittää, vaikuttaako lukitus työkuormaasi ja mitä toimenpiteitä voit tehdä.
Vinkki
Varasto käyttää pöytätason lukitusta. Mikä tahansa DML-operaatio saa lukituksen koko taulukolle, riippumatta siitä, kuinka monta riviä se koskee. Tämä käyttäytyminen eroaa SQL Server:stä, joka tukee rivi- ja sivutason lukkoja.
Edellytykset
- Varasto, jossa on aktiivisia työkuormia.
- Jäsenyys Viewer-työtilassa on vähimmäisoikeus kysyä tämän artikkelin dynaamisia hallintanäkymiä (DMV).
- Lisätietoja DMV:iden vianetsinnästä löytyy osoitteesta Monitori yhteyksiä, istuntoja ja pyyntöjä DMV:n avulla.
Vaihe 1: Tarkista, odottaako kyselyt lukkoja
Aloita tarkistamalla, odottaako lukkoja tällä hetkellä kyselyitä.
Suorita seuraava kysely:
SELECT
request_session_id,
resource_type,
resource_description,
request_mode,
request_status
FROM sys.dm_tran_locks
WHERE request_status = 'WAIT';
Jos kysely palauttaa rivejä, jotkut istunnot odottavat muiden istuntojen hallussa olevia resursseja. Jokainen rivi ilmaisee lukituspyynnön, jota ei tällä hetkellä voida myöntää.
Vinkki
Näkymä sys.dm_tran_locks voi palauttaa suuren määrän rivejä itsestäänselvyyksinä. Suodatus request_status = 'WAIT' keskittyy estyneisiin sessioihin.
Vaihe 2: Tunnista estetyt kyselyt
Seuraavaksi tarkista, mitkä kyselyt on estetty ja mikä istunto estää ne.
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;
Tämä kysely palauttaa:
- Istunto, joka suorittaa estetyn kyselyn (
session_id) - Istunto, joka tällä hetkellä estää sen (
blocking_session_id) - Kuinka kauan se on odottanut (
total_elapsed_time, millisekunneissa) - Onko estoistunnossa avoin transaktio (
open_transaction_count)
Jos kysely näyttää blocking_session_id olevan nollasta poikkeava ja open_transaction_count > 0, se odottaa toista istuntoa, joka pitää lukkoa.
Vaihe 3: Löydä estoistunto
Jotta ymmärrät, mikä resurssi on lukittu, tarkista estosession hallussa olevat lukot. Korvaa aiemmin session_id mainitsemasi esimerkki <blocking_session_id> seuraavassa esimerkkikyselyssä:
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>;
Käytä tätä kyselyä määrittääksesi:
- Mitkä resurssit estoistunnossa tällä hetkellä lukitsevat. Esimerkiksi voit käyttää
sys.objectssitä tunnistamaan,resource_associated_entity_idmissä .resource_type = OBJECT - Lukitustila (esim. Eksklusiivinen (
X), Schema-Modification (Sch-M)) - Riippumatta siitä, liittyykö lukko DDL-operaatioon vai tilastopäivitykseen (
UPDSTATS)
Muistio
Tilastoihin liittyvät lukot (kuten ne ) UPDSTATSesiintyvät myös .sys.dm_tran_locks Schema-Modification (Sch-M) ja eksklusiiviset (X) lukot ovat yleisimpiä estäjiä, mutta mikä tahansa lukkotyyppi voi estää ristiriitaisen pyynnön (esimerkiksi Sch-S estävät Sch-M).
Vaihe 4: Etsi estotapahtuman omistaja
Monissa tapauksissa saatat mieluummin kysyä eston omistajalta COMMIT tai ROLLBACK hänen työtään sen sijaan, että lopettaisit istunnon. Harkitse virheenkäsittelyrakenteiden käyttöä TRYCATCH tai COMMITROLLBACK. Lisätietoja löytyy osoitteesta TRY... KIINNI.
Voit tunnistaa omistajan ja kyselyn, joka liittyy estoistuntoon. Korvaa aiemmin session_id mainitsemasi esimerkki <blocking_session_id> seuraavassa esimerkkikyselyssä:
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_nameon estosession omistaja. -
program_nameon sovellus, joka aloitti istunnon. ArvoDMS_userilmaisee Fabric-portaalin kyselyeditorin. -
commandon tällä hetkellä käynnissä oleva komento.
Voit sitten ottaa yhteyttä kaupan omistajaan sitoutuaksesi tai peruuttaaksesi sen, jos se on sopivaa.
Vaihe 5: Tarkista, onko estosessio käyttämätön vai etenemättä
Estoistunto saattaa vaikuttaa aktiiviselta, mutta ei oikeasti etene.
Käyttämättömän tai pysähtyneen istunnon merkkejä ovat:
-
status = 'sleeping'Tarkoittaa, ettei aktiivista kyselyä ole käynnissä. - Etsi ilmoitus
last_request_start_time, joka on huomattavasti aikaisempi kuin nykyinen aika, mikä viittaa pitkäaikaiseen avoimeen pyyntöön. - Etsi mittari
total_elapsed_time, joka ei nouse tarkistusten välillä, mikä tarkoittaa pysähtynyttä sessiota.
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>;
- Jos istunnon tila on
sleepingjaopen_transaction_count > 0, istunnossa on avoin transaktio ilman aktiivista kyselyä – se pitää lukon ilman työtä. - Jos istunto ilmestyy
sys.dm_exec_requestsjatotal_elapsed_timejatkaa kasvuaan tarkistusten välillä, sessio etenee aktiivisesti. Saattaa olla parempi odottaa tapahtuman valmistumista kuin lopettaa se ja pakottaa palautus.
Vaihe 6: Toimi estämisen ratkaisemiseksi
Muistio
Estotilanteet ratkeavat usein itsestään, kun estoistunto on suorittanut tapahtumansa. Jos työkuormasi kestää viivettä, odotus on turvallisin vaihtoehto.
Jos sinun täytyy avata alavirran kyselyt, harkitse, onko estoistunnolla seuraavat ominaisuudet:
- On avoin tapahtuma
- Vaikuttaa joutilalta tai etenemätön
- Pitääkö lukkoa (esim. Eksklusiivinen (
X) vaiSch-M)
Jos näin on, Admin-työtilan jäsen voi lopettaa istunnon käyttämällä:
KILL <session_id>;
Komento KILL seuraa:
- Lopeta istunto
- Perukaa kaikki kyseisen session aktiivisessa tapahtumassa tehty työ
- Avaa lukko
- Salli alavirran kyselyt edetä
Varoitus
Session lopettaminen peruuttaa kaiken sitoutumattoman työn, joka kyseisessä sessiossa suoritettiin. Tämä toiminto voi kumota käyttäjän tai sovelluksen tekemät tietomuutokset. Käytä tätä vaihtoehtoa vain, kun olet varma, ettei tapahtuman lopettaminen vaikuta negatiivisesti työkuormaasi.
Vaihe 7: Ehkäise tulevat lukitusongelmat
Samanlaisten ongelmien ehkäisemiseksi:
- Vältä eksplisiittisten tapahtumien jättämistä avoimiksi (
BEGIN TRANSACTIONilman vastaavaaCOMMITtaiROLLBACK-merkintää). - Pidä tapahtumat lyhytkestoisia. Suorita vain tarvittavat toiminnot transaktion sisällä.
- Aina
COMMITtaiROLLBACKtransaktioita, kun se on tehty. - Aikatauluta DDL-toiminnot (kuten
ALTER TABLE) vähäisen liikenteen ikkunoiden aikana.
Seuraa ennakoivasti avoimia tapahtumia käyttämällä:
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;
Avoimien tapahtumien säännöllinen seuranta ja tarvittaessa puuttuminen auttaa vähentämään estoketjujen muodostumisen riskiä.