Delen via


Problemen met tempdb in een toegewezen SQL-pool oplossen

Van toepassing op: Azure Synapse Analytics

In een toegewezen SQL-pool wordt de tempdb-database gebruikt voor tijdelijke tabellen en tussenliggende ruimte voor gegevensverplaatsingen (bijvoorbeeld: verplaatsingen in willekeurige volgorde, bijsnijden), sorteren, laden, geheugenlekken en andere bewerkingen. Bovendien voorkomt een niet-doorgevoerde transactie in één sessie die communiceert met de tempdb-database dat het logboek alle andere sessies leeglaat, waardoor de logboekbestanden vollopen. Omdat de tempdb-database een gedeelde resource is, kan het grote verbruik van de tempdb-ruimte ertoe leiden dat query's van andere gebruikers mislukken en kunnen escaleren om te voorkomen dat nieuwe verbindingen tot stand worden gebracht.

Wat moet ik doen als ik geen verbinding kan maken met de toegewezen SQL-pool?

Als u geen bestaande verbindingen hebt om problematische verbindingen of query's te identificeren, is de enige methode voor het oplossen van het niet kunnen maken van een nieuwe verbinding de toegewezen SQL-pool onderbreken en hervatten of de toegewezen SQL-pool schalen . Met deze actie worden de gebruikerstransacties beëindigd die tot dit probleem hebben geleid en wordt de tempdb-database opnieuw gemaakt wanneer de service opnieuw wordt opgestart.

Opmerking: Zorg ervoor dat u de service extra tijd geeft om alle actieve transacties ongedaan te maken, omdat pauze- en schaalbewerkingen langer duren dan normaal in dit scenario.

Problemen met volledige tempdb-gegevensbestanden oplossen

Stap 1: De query identificeren die de tempdb-database vult

Zorg ervoor dat u de query identificeert die de tempdb-database vult terwijl de query wordt uitgevoerd, tenzij u een logboekregistratieonderdeel hebt geïmplementeerd in uw ETL-framework of het controleren van uw toegewezen SQL-poolinstructies. In de meeste gevallen is de langst lopende query die wordt uitgevoerd tijdens het tijdsbestek waarin het probleem zich voordeed, de oorzaak van de tempdb-fouten met onvoldoende ruimte. Voer de volgende query uit om een lijst met langlopende query's op te halen:

SELECT TOP 5 *
FROM sys.dm_pdw_exec_requests
WHERE status = 'running'
ORDER BY total_elapsed_time desc;

Zodra u een redelijk verdachte query hebt, kunt u een van de volgende opties proberen:

  • Dood de verklaring.
  • Probeer te voorkomen dat andere werkbelastingen de tempdb-ruimte verder gebruiken, zodat de long-runner kan worden voltooid.

Stap 2: Het terugkeerpatroon voorkomen

Nadat u de verantwoordelijke query hebt geïdentificeerd en actie hebt ondernomen, kunt u overwegen om oplossingen te implementeren om te voorkomen dat het probleem terugkeert. In de volgende tabel ziet u oplossingen voor de meest voorkomende oorzaken van volledige tempdb-fouten:

Oorzaak Beschrijving Oplossing
Slecht gedistribueerd plan Het gedistribueerde plan dat voor een bepaalde query is gegenereerd, kan per ongeluk gegevensverplaatsing met een hoge frequentie veroorzaken als gevolg van slecht onderhouden tabelstatistieken. Werk statistieken voor relevante tabellen bij en zorg ervoor dat ze volgens een regelmatig schema worden onderhouden.
Slechte status van geclusterde columnstore-index (CCI) Het verbruikt de tempdb-ruimte als gevolg van geheugenstoringen. Bouw CCIS's opnieuw en zorg ervoor dat ze volgens een normaal schema worden onderhouden.
Grote transacties Grote hoeveelheden CREATE TABLE AS SELECT (CTAS) of INSERT SELECT instructies vullen de tempdb in tijdens bewerkingen voor gegevensverplaatsing. Splits uwCTAS- of INSERT SELECT-instructie op in meerdere, kleinere transacties.
Onvoldoende geheugentoewijzing Query's met onvoldoende toegewezen geheugen (via resourceklasse of workloadgroep) kunnen overlopen in tempdb. Voer uw query's uit met een grotere resourceklasse of een groep met meer resources.
Externe-tabelquery's voor eindgebruikers Query's op externe tabellen zijn niet optimaal voor query's van eindgebruikers, omdat de engine het hele bestand tempdb moet lezen voordat de gegevens worden verwerkt. Laad de gegevens in een permanente tabel en stuur vervolgens gebruikersquery's hier naartoe.
Onvoldoende algemene resources Het kan zijn dat uw toegewezen SQL-pool zich tijdens een hoge activiteit dicht bij de maximale tempdb-capaciteit bevindt. Overweeg om uw toegewezen SQL-pool op te schalen in combinatie met een van de bovenstaande oplossingen.

Problemen met volledige tempdb-transactielogboekbestanden oplossen

Het tempdb-transactielogboek vult doorgaans alleen op wanneer een client/gebruiker:

  • Hiermee opent u een expliciete transactie, maar geeft u nooit een COMMIT of ROLLBACK.
  • Sets IMPLICIT_TRANSACTION = ON (met name voor JDBC-clients en hulpprogramma's die gebruikmaken van AutoCommit-functies).

Stap 1: Openstaande transacties identificeren

De problematische verbindingen kunnen afkomstig zijn van clients die een geopende transactie hebben, maar een niet-actieve status hebben. Voer de volgende query uit om dit scenario te identificeren:

SELECT *
FROM sys.dm_pdw_exec_sessions
WHERE is_transactional = 1
AND status = 'Idle';

Opmerking: Niet alle verbindingen die als gevolg van deze query worden geretourneerd, zijn noodzakelijkerwijs problematisch. Voer de query minstens twee keer uit met meer dan 15 minuten tussen uitvoeringen en kijk welke verbindingen in deze status behouden blijven.

Stap 2: het probleem beperken en voorkomen

Nadat u hebt geïdentificeerd welke clients openstaande transacties houden, kunt u samenwerken met de gebruikers om een of beide te wijzigen:

  • Stuurprogrammaconfiguratie (bijvoorbeeld: JDBC AutoCommit-instelling op off, waarmee IMPLICIT_TRANSACTIONS = ON)
  • Ad-hocquerygedrag (bijvoorbeeld: onjuist uitvoeren BEGIN TRAN zonder COMMIT/ROLLBACK)

U kunt ook overwegen om een geautomatiseerd proces te maken om dit scenario periodiek te detecteren en mogelijke problematische sessies te beëindigen .

Resources