Udostępnij za pośrednictwem


Tabele czasowe wersjonowane przez system z pamięciowo zoptymalizowanymi tabelami

Dotyczy: SQL Server 2016 (13.x) i nowszych azure SQL Managed Instance

Tabele czasowe z wersjonowaniem systemowym dla tabel zoptymalizowanych pod kątem pamięci zapewniają ekonomiczne rozwiązanie dla scenariuszy, gdzie wymagane są inspekcja danych i analiza punktu w czasie na podstawie danych zebranych przy użyciu obciążeń OLTP In-Memory.

Notatka

Tabele czasowe zoptymalizowane pod kątem pamięci są dostępne tylko w programie SQL Server i usłudze Azure SQL Managed Instance. Tabele zoptymalizowane pod kątem pamięci i tabele czasowe są niezależnie dostępne w usłudze Azure SQL Database.

Przegląd

Tabele czasowe z wersjonowaniem systemowym automatycznie przechowują pełną historię zmian danych i oferują wygodne rozszerzenia Transact-SQL do analizy punktowej w czasie. W typowym scenariuszu historia danych jest przechowywana przez długi czas (wiele miesięcy, nawet lat), mimo że nie jest regularnie odpytywane.

Inspekcja danych i analiza oparta na czasie mogą być wymagane w różnych środowiskach, zwłaszcza w systemach OLTP, które przetwarzają bardzo dużą liczbę żądań i gdzie jest używana technologia OLTP In-Memory. Jednak użycie tabel zoptymalizowanych pod kątem pamięci w scenariuszach czasowych jest trudne, ponieważ ogromna ilość wygenerowanych danych historycznych często przekracza limit dostępnej pamięci RAM. Jednocześnie używanie pamięci RAM do przechowywania danych historycznych tylko do odczytu, do których uzyskuje się dostęp rzadziej, ponieważ staje się starsze, nie jest optymalnym rozwiązaniem.

Tabele systemowe z wersjonowaniem czasowym dla tabel zoptymalizowanych pod kątem pamięci zapewniają wysoką przepustowość transakcyjną i współbieżność bez blokad. Umożliwiają one przechowywanie dużej ilości danych historii przy użyciu tabel w pamięci do przechowywania bieżących danych (tabeli czasowej) i tabel opartych na dyskach dla danych historycznych. Wpływ na operacje DML jest zmniejszany dzięki użyciu wewnętrznej, automatycznie wygenerowanej tabeli tymczasowej zoptymalizowanej pod kątem pamięci, która przechowuje najnowsze dane i umożliwia wykonywanie operacji DML z natywnie skompilowanego kodu.

Na poniższym diagramie przedstawiono tę architekturę.

Diagram architektury czasowej w pamięci.

Szczegóły implementacji

Podczas tworzenia tabeli zoptymalizowanej pod kątem pamięci w wersji systemu należy pamiętać o następujących kwestiach. Aby uzyskać informacje na temat opcji składni i przykładu, zobacz CREATE TABLE.

  • Tylko trwałe tabele zoptymalizowane pod kątem pamięci mogą być wersjonowane systemowo (DURABILITY = SCHEMA_AND_DATA).

  • Tabela historyczna dla tabeli zoptymalizowanej pod kątem pamięci z wersjonowaniem systemowym musi być dyskowa, bez względu na to, czy została utworzona przez użytkownika końcowego, czy przez system.

  • Zapytania, które mają wpływ tylko na bieżącą tabelę w pamięci, mogą być używane w natywnie skompilowanych modułów języka T-SQL. Zapytania czasowe korzystające z klauzuli FOR SYSTEM TIME nie są obsługiwane w modułach kompilowanych natywnie. Klauzula FOR SYSTEM TIME jest obsługiwana w tabelach zoptymalizowanych pod kątem pamięci w zapytaniach ad hoc i modułach innych niż natywne.

  • W przypadku SYSTEM_VERSIONING = ONautomatycznie tworzona jest wewnętrzna tabela przejściowa zoptymalizowana pod kątem pamięci, aby zaakceptować najbardziej aktualne zmiany związane z wersjonowaniem systemu, wynikające z operacji aktualizacji i usuwania w bieżącej tabeli zoptymalizowanej pod kątem pamięci.

  • Dane z wewnętrznej tabeli przejściowej zoptymalizowanej pamięciowo są regularnie przenoszone do tabeli historii opartej na dysku przez asynchroniczne zadanie opróżniania danych. Ten mechanizm opróżniania danych utrzymuje wewnętrzne bufory pamięci na poziomie niższym niż 10 procent zużycia pamięci przez ich obiekty nadrzędne. Możesz śledzić całkowite zużycie pamięci w tabeli czasowej zoptymalizowanej pod kątem pamięci w wersji systemowej, wykonując zapytanie dotyczące sys.dm_db_xtp_memory_consumersi podsumowując dane dla wewnętrznej tabeli przejściowej zoptymalizowanej pod kątem pamięci i bieżącej tabeli czasowej.

  • Dane można oczyścić ręcznie, uruchamiając sp_xtp_flush_temporal_history.

  • W przypadku SYSTEM_VERSIONING = OFFlub gdy schemat tabeli w wersji systemowej jest modyfikowany przez dodawanie, upuszczanie lub zmienianie kolumn, cała zawartość wewnętrznego buforu przejściowego jest przenoszona do tabeli historii opartej na dysku.

  • Wykonywanie zapytań dotyczących danych historycznych odbywa się skutecznie na poziomie izolacji migawkowej i zawsze zwraca połączenie między buforem tymczasowym w pamięci a tabelą opartą na dysku, bez duplikatów.

  • ALTER TABLE operacje, które zmieniają schemat tabeli wewnętrznie, muszą wykonywać opróżnianie danych, co może wydłużyć czas trwania operacji.

Wewnętrzna tabela przejściowa zoptymalizowana pod kątem pamięci

System tworzy wewnętrzną tabelę tymczasową zoptymalizowaną pod kątem pamięci, aby usprawnić operacje DML.

  • Nazwa tabeli jest generowana w następującym formacie: Memory_Optimized_History_Table_<object_id> gdzie <object_id> jest identyfikatorem bieżącej tabeli czasowej.

  • Tabela replikuje schemat aktualnej tabeli temporalnej, dodając jedną kolumnę bigint . Ta dodatkowa kolumna zapewnia unikalność wierszy przeniesionych do wewnętrznego bufora historii.

  • Dodatkowa kolumna ma następujący format nazwy: Change_ID[<suffix>], gdzie <suffix> jest opcjonalnie dodawana w przypadku, gdy tabela ma już kolumnę Change_ID.

  • Maksymalny rozmiar wiersza dla tabeli wersjonowanej systemowo pamięciooptymalizowanej jest zmniejszony o 8 bajtów ze względu na dodatkową kolumnę bigint w tabeli etapowej. Nowa wartość maksymalna wynosi teraz 8052 bajty.

  • Wewnętrzna tabela przejściowa zoptymalizowana pod kątem pamięci nie jest reprezentowana w Eksploratorze obiektów programu SQL Server Management Studio.

  • Metadane dotyczące tej tabeli i jej połączenia z bieżącą tabelą czasową można znaleźć w sys.internal_tables.

Zadanie opróżniania danych

Opróżnianie danych to regularnie aktywowane zadanie, które sprawdza, czy jakakolwiek tabela zoptymalizowana pod kątem pamięci spełnia warunek oparty na rozmiarze pamięci na potrzeby przenoszenia danych. Przenoszenie danych rozpoczyna się, gdy zużycie pamięci w wewnętrznej tabeli przejściowej osiągnie osiem procent użycia pamięci bieżącej tabeli czasowej.

Zadanie opróżniania danych jest regularnie aktywowane z harmonogramem, który różni się w zależności od istniejącego obciążenia. W przypadku dużego obciążenia zadanie jest uruchamiane tak często, jak co 5 sekund. Przy lekkim obciążeniu częstotliwość wzrasta do każdej minuty. Dla każdej wewnętrznej tabeli przejściowej zoptymalizowanej pod kątem pamięci, która wymaga czyszczenia, uruchomiony jest jeden wątek.

Opróżnianie danych usuwa wszystkie rekordy z wewnętrznego buforu w pamięci, który jest starszy niż najstarsza aktualnie uruchomiona transakcja, aby przenieść te rekordy do tabeli historii opartej na dysku.

Możesz wykonać opróżnienie danych, uruchamiając sp_xtp_flush_temporal_history i określając nazwę schematu i tabeli:

EXEC sys.sp_xtp_flush_temporal_history <schema_name>, <object_name>;

Ten sam proces przenoszenia danych jest wywoływany, gdy system wykonuje zadanie opróżniania danych zgodnie z harmonogramem wewnętrznym.