Udostępnij za pośrednictwem


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.

  1. 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
    
  2. 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;
    
  3. 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 tabeli SalesOrderDetail:

    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

  1. 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
    
  2. 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
    
  3. 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.

  1. 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
    
  2. 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.

  1. 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;
    
  2. Wstaw 1000 000 wierszy:

    EXECUTE usp_InsertSampleCarts 1000000;
    
  3. 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;