Udostępnij za pośrednictwem


Rozwiązywanie problemów z bazą danych tempdb w dedykowanej puli SQL

Dotyczy: Azure Synapse Analytics

W dedykowanej puli SQL baza danych tempdb jest używana do tabel tymczasowych i miejsca pośredniego na potrzeby przenoszenia danych (na przykład: przetasowania ruchów, przenoszenia przycinania), sortowania, ładowania, rozlania pamięci i innych operacji. Ponadto transakcja niezatwierdzona w jednej sesji, która wchodzi w interakcję z bazą danych tempdb, uniemożliwi opróżnianie dziennika wszystkich innych sesji, co powoduje wypełnienie plików dziennika. Ponieważ baza danych tempdb jest zasobem udostępnionym, duże użycie miejsca w bazie danych tempdb może spowodować niepowodzenie zapytań innych użytkowników i eskalację, aby zapobiec nawiązywaniu nowych połączeń.

Co zrobić, jeśli nie mogę nawiązać połączenia z dedykowaną pulą SQL?

Jeśli nie masz istniejących połączeń w celu zidentyfikowania żadnych problematycznych połączeń lub zapytań, jedyną metodą rozpoznawania braku możliwości utworzenia nowego połączenia jest wstrzymanie i wznowienie lub skalowanie dedykowanej puli SQL. Ta akcja spowoduje zakończenie transakcji użytkownika, które doprowadziły do tego problemu i ponowne utworzenie bazy danych tempdb po ponownym uruchomieniu usługi.

Uwaga: Pamiętaj, aby zapewnić usłudze dodatkowy czas na cofnięcie wszystkich uruchomionych transakcji, ponieważ w tym scenariuszu operacje wstrzymywania i skalowania mogą trwać dłużej niż zwykle.

Rozwiązywanie problemów z pełnymi plikami danych bazy danych tempdb

Krok 1. Identyfikowanie zapytania, które wypełnia bazę danych tempdb

Upewnij się, że zidentyfikowano zapytanie, które wypełnia bazę danych tempdb podczas wykonywania zapytania, chyba że zaimplementowano składnik rejestrowania w strukturze ETL lub inspekcję dedykowanych instrukcji puli SQL. W większości przypadków, nie zawsze, najdłużej działające zapytanie wykonywane w przedziale czasu, w którym wystąpił problem, jest przyczyną błędów miejsca w bazie danych tempdb. Uruchom następujące zapytanie, aby uzyskać listę długotrwałych zapytań:

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

Gdy masz dość podejrzane zapytanie, wypróbuj jedną z następujących opcji:

  • Zabij instrukcję .
  • Spróbuj zapobiec dalszemu używaniu miejsca bazy danych tempdb w innym obciążeniu, aby można było ukończyć długi moduł uruchamiający.

Krok 2. Zapobieganie cyklowi

Po zidentyfikowaniu i podjęciu akcji względem odpowiedzialnego zapytania rozważ zaimplementowanie środków zaradczych, aby zapobiec cyklicznemu problemowi. W poniższej tabeli przedstawiono środki zaradcze dla najczęstszych przyczyn pełnych błędów bazy danych tempdb:

Przyczyna opis Ograniczanie ryzyka
Zły plan rozproszony Plan rozproszony wygenerowany dla danego zapytania może przypadkowo wprowadzać przenoszenie danych o wysokiej częstotliwości w wyniku źle utrzymywanych statystyk tabeli. Zaktualizuj statystyki dla odpowiednich tabel i upewnij się, że są one przechowywane zgodnie z regularnym harmonogramem.
Zła kondycja indeksów klastrowanych magazynów kolumn (CCI) Zużywa miejsce w bazie danych tempdb z powodu rozlania pamięci. Ponownie skompiluj interfejsy CCI i upewnij się, że są one utrzymywane zgodnie z regularnym harmonogramem.
Duże transakcje Duża ilość instrukcji CREATE TABLE AS SELECT (CTAS) lub INSERT SELECT wypełnia bazę danych tempdb podczas operacji przenoszenia danych. Podziel instrukcję CTAS lub INSERT SELECT na wiele mniejszych transakcji.
Niewystarczająca alokacja pamięci Zapytania z niewystarczającą ilością pamięci przydzielonej (za pośrednictwem klasy zasobów lub grupy obciążenia) mogą rozlać się do tempdbelementu . Wykonaj zapytania przy użyciu większej klasy zasobów lub grupy obciążeń z większą ilością zasobów.
Zapytania dotyczące tabel zewnętrznych użytkownika końcowego Zapytania względem tabel zewnętrznych nie są optymalne dla zapytań użytkowników końcowych, ponieważ aparat musi odczytać cały plik tempdb przed przetworzeniem danych. Załaduj dane do tabeli trwałej, a następnie przekieruj do tej tabeli zapytania użytkowników.
Niewystarczająca ogólna ilość zasobów Może się okazać, że dedykowana pula SQL jest zbliżona do maksymalnej pojemności bazy danych tempdb podczas wysokiej aktywności. Rozważ skalowanie w górę dedykowanej puli SQL w połączeniu z dowolnym z powyższych środków zaradczych.

Rozwiązywanie problemów z pełnymi plikami dziennika transakcji bazy danych tempdb

Dziennik transakcji bazy danych tempdb zwykle wypełnia się tylko wtedy, gdy klient/użytkownik:

  • Otwiera jawną transakcję, ale nigdy nie wystawia elementu COMMIT lub ROLLBACK.
  • Zestawy IMPLICIT_TRANSACTION = ON (szczególnie w przypadku klientów i narzędzi JDBC korzystających z funkcji AutoCommit).

Krok 1. Identyfikowanie otwartych transakcji

Problematyczne połączenia mogą pochodzić z klientów, którzy mają otwartą transakcję, ale mają stan "Bezczynność". Uruchom następujące zapytanie, aby ułatwić zidentyfikowanie tego scenariusza:

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

Uwaga: Nie wszystkie połączenia zwracane w wyniku tego zapytania muszą być problematyczne. Uruchom zapytanie co najmniej dwa razy z ponad 15 minut między wykonaniami i sprawdź, które połączenia utrzymują się w tym stanie.

Krok 2. Eliminowanie problemu i zapobieganie temu problemowi

Po zidentyfikowaniu klientów, którzy przechowują otwarte transakcje, skontaktuj się z użytkownikami, aby zmienić jedną lub obie te transakcje:

  • Konfiguracja sterownika (na przykład: ustawienie autopolecenia JDBC na off, które ustawia )IMPLICIT_TRANSACTIONS = ON
  • Zachowania zapytań ad hoc (na przykład: niepoprawne BEGIN TRAN wykonywanie bez/COMMITROLLBACK )

Alternatywnie możesz rozważyć utworzenie zautomatyzowanego procesu w celu okresowego wykrywania tego scenariusza i zabijania potencjalnie problematycznych sesji.

Zasoby