Kolumna is_memory_optimized w sys.tables wskazuje, czy tabela jest przechowywana w pamięci operacyjnej.
Co oznacza is_memory_optimized w widoku sys.tables
Kolumna is_memory_optimized w katalogowym widoku sys.tables informuje, czy dana tabela w SQL Server została utworzona jako tabela zoptymalizowana pod kątem przechowywania w pamięci. Wartość 1 oznacza tabelę memory-optimized, natomiast wartość 0 oznacza zwykłą tabelę dyskową, czyli tabelę opartą na standardowym mechanizmie tabel SQL Server. Kolumna ma typ logiczny bit, dlatego jej wynik jest przedstawiany jako zero albo jeden.
Wartość tej kolumny opisuje cechę definicji tabeli, a nie chwilowe zajęcie pamięci RAM przez dane. Każda tabela SQL Server korzysta z pamięci podręcznej podczas pracy silnika, ale tylko tabela utworzona z opcją MEMORY_OPTIMIZED = ON należy do mechanizmu In-Memory OLTP. Z tego powodu is_memory_optimized = 0 nie oznacza, że tabela nigdy nie jest ładowana do pamięci, a is_memory_optimized = 1 nie jest prostym pomiarem aktualnego zużycia RAM.
Jak odczytać właściwość tabeli w SQL Server
Podstawowe sprawdzenie można wykonać zapytaniem skierowanym do widoku sys.tables w konkretnej bazie danych:
SELECT name, schema_id, is_memory_optimized FROM sys.tables ORDER BY name;
Widok zwraca informacje tylko dla bieżącego kontekstu bazy danych, dlatego przed wykonaniem zapytania trzeba wybrać właściwą bazę poleceniem USE albo uruchomić zapytanie z kwalifikacją nazwy bazy. Aby otrzymać czytelniejszy wynik wraz z nazwą schematu, można połączyć sys.tables z sys.schemas: SELECT s.name AS schema_name, t.name AS table_name, t.is_memory_optimized FROM sys.tables AS t JOIN sys.schemas AS s ON s.schema_id = t.schema_id ORDER BY s.name, t.name;. Taki odczyt pozwala odróżnić tabele o takich samych nazwach znajdujące się w różnych schematach.
Różnice między tabelą memory-optimized a tabelą dyskową
Tabela memory-optimized jest przeznaczona do pracy z funkcją In-Memory OLTP i wymaga odpowiedniej konfiguracji bazy oraz dostępnego pliku danych typu FILESTREAM lub filegroup oznaczonego jako CONTAINS MEMORY_OPTIMIZED_DATA. Sam wynik is_memory_optimized nie opisuje wszystkich wymagań, indeksów ani ograniczeń obowiązujących dla takiej tabeli. Nie określa także, czy aplikacja rzeczywiście uzyskuje korzyść wydajnościową z zastosowania tej technologii.
Dla tabel memory-optimized SQL Server stosuje odrębne mechanizmy przechowywania wersji wierszy i obsługi współbieżności. Dane robocze są utrzymywane w pamięci, natomiast trwałość jest realizowana zgodnie z ustawieniami tabeli i bazy, między innymi przez pliki kontrolne oraz checkpoint files związane z filegroupem danych zoptymalizowanych pamięciowo. Po restarcie instancji SQL Server odtwarza trwałe dane zgodnie z wybranym poziomem trwałości tabeli. Tabela dyskowa korzysta natomiast ze standardowych stron danych, bufora oraz dziennika transakcji SQL Server.
Przy analizie nie należy traktować wartości is_memory_optimized jako polecenia migracji tabeli. Zmiana zwykłej tabeli na memory-optimized może wymagać oceny typów danych, kluczy, indeksów, wyzwalaczy, ograniczeń, procedur oraz używanych poziomów izolacji. W wielu przypadkach utworzenie nowej tabeli, przeniesienie danych i dostosowanie zależności jest osobnym projektem administracyjnym, a nie operacją wykonywaną przez zmianę jednej właściwości w katalogu systemowym.
Znaczenie wyniku podczas analizy instancji SQL Server
Odczyt is_memory_optimized pomaga ustalić, z jakiego modelu przechowywania korzysta tabela i czy dalszej analizy wymagają elementy In-Memory OLTP. Jeżeli zapytanie zwraca 1, warto sprawdzić także nazwę bazy, konfigurację filegroupu MEMORY_OPTIMIZED_DATA, definicje indeksów oraz zapytania korzystające z tej tabeli. Przydatne jest porównanie wyniku katalogowego z metadanymi indeksów i z rzeczywistymi obciążeniami, ponieważ sama obecność tabeli memory-optimized nie potwierdza poprawności projektu ani przyczyny problemu z wydajnością.
Wartość 0 wskazuje, że tabela nie została zdefiniowana jako memory-optimized, ale nie przesądza o jej stanie technicznym. Problemy z wolnym odczytem, blokowaniem, dużą liczbą operacji wejścia-wyjścia albo rozrostem bazy mogą dotyczyć tabel dyskowych i wymagać analizy indeksów, planów wykonania, statystyk, rozmiaru danych oraz dziennika transakcji. Z kolei przy tabeli z wartością 1 diagnostyka powinna uwzględniać specyfikę In-Memory OLTP, zamiast zakładać, że obowiązują dokładnie te same mechanizmy co dla tabel standardowych.
Widok sys.tables opisuje metadane przechowywane przez SQL Server, więc jego wynik jest punktem wyjścia do weryfikacji schematu. Nie zastępuje dokumentacji wersji silnika, analizy konfiguracji ani testu zapytań na reprezentatywnych danych. Poprawna interpretacja polega na powiązaniu wartości is_memory_optimized z konkretną bazą danych i konkretną tabelą, a następnie sprawdzeniu, czy sposób przechowywania odpowiada wymaganiom aplikacji oraz używanym operacjom transakcyjnym.