Vianetsintä kyselyjen estosta Fabric tietovarasto

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

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.objects sitä tunnistamaan, resource_associated_entity_id missä .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_name on estosession omistaja.
  • program_name on sovellus, joka aloitti istunnon. Arvo DMS_user ilmaisee Fabric-portaalin kyselyeditorin.
  • command on 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 sleeping ja open_transaction_count > 0, istunnossa on avoin transaktio ilman aktiivista kyselyä – se pitää lukon ilman työtä.
  • Jos istunto ilmestyy sys.dm_exec_requests ja total_elapsed_time jatkaa 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) vai Sch-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 TRANSACTION ilman vastaavaa COMMIT tai ROLLBACK-merkintää).
  • Pidä tapahtumat lyhytkestoisia. Suorita vain tarvittavat toiminnot transaktion sisällä.
  • Aina COMMIT tai ROLLBACK transaktioita, 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ä.