Przewodnik dotyczący funkcji wydajności programu SQL Server w systemie Linux
Dotyczy:programu SQL Server — Linux
Jeśli jesteś użytkownikiem systemu Linux, który jest nowym użytkownikiem programu SQL Server, następujące zadania przeprowadzą Cię przez niektóre funkcje wydajności. Nie są one unikatowe ani specyficzne dla systemu Linux, ale pomagają w dalszym zbadaniu obszarów. W każdym przykładzie znajduje się link do dokumentacji szczegółowej dla tego obszaru.
Notatka
W poniższych przykładach użyto przykładowej bazy danych AdventureWorks2022
. Aby uzyskać instrukcje dotyczące uzyskiwania i instalowania tej przykładowej bazy danych, zobacz Migrowanie bazy danych programu SQL Server z systemu Windows do systemu Linux przy użyciu kopii zapasowej i przywracania.
Utwórz indeks magazynowy kolumnowy
Indeks magazynu kolumn to technologia do przechowywania i wykonywania zapytań dotyczących dużych magazynów danych w formacie danych kolumnowych nazywanym magazynem kolumn.
Dodaj indeks kolumnowy do tabeli
SalesOrderDetail
, wykonując następujące polecenia Transact-SQL:CREATE NONCLUSTERED COLUMNSTORE INDEX [IX_SalesOrderDetail_ColumnStore] ON Sales.SalesOrderDetail(UnitPrice, OrderQty, ProductID); GO
Wykonaj następujące zapytanie, które używa indeksu magazynu kolumn do skanowania tabeli:
SELECT ProductID, SUM(UnitPrice) AS SumUnitPrice, AVG(UnitPrice) AS AvgUnitPrice, SUM(OrderQty) AS SumOrderQty, AVG(OrderQty) AS AvgOrderQty FROM Sales.SalesOrderDetail GROUP BY ProductID ORDER BY ProductID;
Sprawdź, czy indeks magazynu kolumn został użyty, wyszukując
object_id
dla indeksu magazynu kolumn i sprawdzając, czy jest wyświetlany w statystykach użycia dla tabeliSalesOrderDetail
:SELECT * FROM sys.indexes WHERE name = 'IX_SalesOrderDetail_ColumnStore'; GO SELECT * FROM sys.dm_db_index_usage_stats WHERE database_id = DB_ID('AdventureWorks2022') AND object_id = OBJECT_ID('AdventureWorks2022.Sales.SalesOrderDetail');
Korzystanie z In-Memory OLTP
Program SQL Server udostępnia In-Memory funkcji OLTP, które mogą znacznie poprawić wydajność systemów aplikacji. W tej sekcji przedstawiono procedurę tworzenia tabeli zoptymalizowanej pod kątem pamięci przechowywanej w pamięci oraz natywnie skompilowanej procedury składowanej, która może uzyskać dostęp do tabeli bez konieczności kompilowania lub interpretowania.
Konfigurowanie bazy danych dla In-Memory OLTP
Należy ustawić bazę danych na poziom zgodności co najmniej 130, aby używać In-Memory OLTP. Użyj następującego zapytania, aby sprawdzić bieżący poziom zgodności
AdventureWorks2022
:USE AdventureWorks2022; GO SELECT d.compatibility_level FROM sys.databases AS d WHERE d.name = DB_NAME(); GO
W razie potrzeby zaktualizuj poziom do 130:
ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL = 130; GO
Gdy transakcja obejmuje zarówno tabelę opartą na dysku, jak i tabelę zoptymalizowaną pod kątem pamięci, niezbędne jest, aby część transakcji zoptymalizowana pod kątem pamięci działała na poziomie izolacji transakcji o nazwie SNAPSHOT. Aby niezawodnie wymusić ten poziom dla tabel zoptymalizowanych pod kątem pamięci w transakcji między kontenerami, wykonaj następujące czynności:
ALTER DATABASE CURRENT SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON; GO
Przed utworzeniem tabeli zoptymalizowanej pod kątem pamięci należy najpierw utworzyć grupę plików zoptymalizowaną pod kątem pamięci i kontener dla plików danych:
ALTER DATABASE AdventureWorks2022 ADD FILEGROUP AdventureWorks_mod CONTAINS MEMORY_OPTIMIZED_DATA; GO ALTER DATABASE AdventureWorks2022 ADD FILE (NAME = 'AdventureWorks_mod', FILENAME = '/var/opt/mssql/data/AdventureWorks_mod') TO FILEGROUP AdventureWorks_mod; GO
Tworzenie tabeli zoptymalizowanej pod kątem pamięci
Podstawowym magazynem tabel zoptymalizowanych pod kątem pamięci jest pamięć główna, dlatego w odróżnieniu od tabel dyskowych, dane nie muszą być odczytywane z dysku do pamięci. Aby utworzyć tabelę zoptymalizowaną pod kątem pamięci, użyj klauzuli MEMORY_OPTIMIZED = ON.
Wykonaj następujące zapytanie, aby utworzyć zoptymalizowaną pod kątem pamięci tabelę dbo.ShoppingCart. Domyślnie dane są utrwalane na dysku na potrzeby trwałości (trwałość można również ustawić tak, aby utrwały tylko schemat).
CREATE TABLE dbo.ShoppingCart ( ShoppingCartId INT IDENTITY (1, 1) PRIMARY KEY NONCLUSTERED, UserId INT NOT NULL INDEX ix_UserId NONCLUSTERED HASH WITH (BUCKET_COUNT = 1000000), CreatedDate DATETIME2 NOT NULL, TotalPrice MONEY ) WITH (MEMORY_OPTIMIZED = ON); GO
Wstaw kilka rekordów do tabeli:
INSERT dbo.ShoppingCart VALUES (8798, SYSDATETIME(), NULL); INSERT dbo.ShoppingCart VALUES (23, SYSDATETIME(), 45.4); INSERT dbo.ShoppingCart VALUES (80, SYSDATETIME(), NULL); INSERT dbo.ShoppingCart VALUES (342, SYSDATETIME(), 65.4);
Natywnie skompilowane procedury składowane
Program SQL Server obsługuje natywnie skompilowane procedury składowane, które uzyskują dostęp do tabel zoptymalizowanych pod kątem pamięci. Instrukcje języka T-SQL są kompilowane do kodu maszynowego i przechowywane jako natywne biblioteki DLL, co umożliwia szybszy dostęp do danych i wydajniejsze wykonywanie zapytań niż tradycyjny język T-SQL. Procedury przechowywane oznaczone jako NATIVE_COMPILATION są kompilowane na poziomie natywnym.
Wykonaj następujący skrypt, aby utworzyć natywnie skompilowaną procedurę składowaną, która wstawia dużą liczbę rekordów do tabeli ShoppingCart:
CREATE PROCEDURE dbo.usp_InsertSampleCarts @InsertCount INT WITH NATIVE_COMPILATION, SCHEMABINDING AS BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english') DECLARE @i AS INT = 0; WHILE @i < @InsertCount BEGIN INSERT INTO dbo.ShoppingCart VALUES (1, SYSDATETIME(), NULL); SET @i += 1; END END;
Wstaw 1000 000 wierszy:
EXECUTE usp_InsertSampleCarts 1000000;
Sprawdź, czy wiersze zostały wstawione:
SELECT COUNT(*) FROM dbo.ShoppingCart;
Użyj magazynu zapytań
Magazyn zapytań zbiera szczegółowe informacje o wydajności zapytań, planach wykonywania i statystykach środowiska uruchomieniowego.
Przed programem SQL Server 2022 (16.x) magazyn zapytań nie jest domyślnie włączony i można go włączyć za pomocą polecenia ALTER DATABASE:
ALTER DATABASE AdventureWorks2022
SET QUERY_STORE = ON;
Uruchom następujące zapytanie, aby uzyskać informacje o zapytaniach i planach w magazynie zapytań.
SELECT Txt.query_text_id,
Txt.query_sql_text,
Pl.plan_id,
Qry.*
FROM sys.query_store_plan AS Pl
INNER JOIN sys.query_store_query AS Qry
ON Pl.query_id = Qry.query_id
INNER JOIN sys.query_store_query_text AS Txt
ON Qry.query_text_id = Txt.query_text_id;
Wykonywanie zapytań dotyczących dynamicznych widoków zarządzania
Dynamiczne widoki zarządzania zwracają informacje o stanie serwera, które można wykorzystać do monitorowania stanu zdrowia instancji serwera, diagnozowania problemów i dostrajania wydajności.
Aby wysłać zapytanie do widoku dynamicznego zarządzania statystykami dm_os_wait:
SELECT wait_type,
wait_time_ms
FROM sys.dm_os_wait_stats;
Powiązana zawartość
- Badanie obszarów początkowych w In-Memory OLTP
- Planowanie wdrożenia funkcji OLTP In-Memory w programie SQL Server
- Szybsza tabela tymczasowa i zmienna tabelaryczna dzięki optymalizacji pamięci
- Monitorowanie i rozwiązywanie problemów z użyciem pamięci za pomocą OLTP w pamięci
- In-Memory omówienie OLTP i scenariusze użycia
- narzędzia do monitorowania wydajności i dostrajania
- Najlepsze rozwiązania i wytyczne dotyczące konfiguracji programu SQL Server w systemie Linux
- Szybki start: instalowanie programu SQL Server i tworzenie bazy danych w usłudze Red Hat