Sdílet prostřednictvím


Návod k funkcím výkonu SQL Serveru v Linuxu

platí pro:SQL Server – Linux

Pokud jste uživatelem Linuxu, který s SQL Serverem začíná, provedou vás následující úlohy některými funkcemi výkonu. Nejsou jedinečné nebo specifické pro Linux, ale pomáhají vám získat představu o oblastech, které je potřeba prozkoumat podrobněji. V každém příkladu je k dispozici odkaz na podrobnou dokumentaci pro danou oblast.

Poznámka

Následující příklady používají ukázkovou databázi AdventureWorks2022. Pokyny k získání a instalaci této ukázkové databáze najdete v tématu Migrace databáze SQL Serveru z Windows do Linuxu pomocí zálohování a obnovení.

Vytvoření indexu columnstore

Index sloupcového úložiště je technologie pro ukládání a provádění dotazů na velká úložiště dat ve sloupcovém formátu, nazývaném sloupcový úložiště.

  1. Přidejte do tabulky SalesOrderDetail sloupcový index spuštěním následujících příkazů Transact-SQL:

    CREATE NONCLUSTERED COLUMNSTORE INDEX [IX_SalesOrderDetail_ColumnStore]
        ON Sales.SalesOrderDetail(UnitPrice, OrderQty, ProductID);
    GO
    
  2. Spusťte následující dotaz, který k prohledávání tabulky používá index columnstore:

    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. Ověřte, že index columnstore byl použit tím, že vyhledáte object_id pro index columnstore a potvrdíte, že se zobrazuje ve statistikách využití tabulky 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');
    

Použití In-Memory OLTP

SQL Server poskytuje In-Memory funkce OLTP, které můžou výrazně zlepšit výkon aplikačních systémů. Tato část vás provede postupem vytvoření tabulky optimalizované pro paměť uloženou v paměti a nativně zkompilované uložené procedury, která má přístup k tabulce bez nutnosti kompilace nebo interpretace.

Konfigurace databáze pro In-Memory OLTP

  1. Databázi byste měli nastavit na úroveň kompatibility minimálně 130, aby používala In-Memory OLTP. Pomocí následujícího dotazu zkontrolujte aktuální úroveň kompatibility AdventureWorks2022:

    USE AdventureWorks2022;
    GO
    
    SELECT d.compatibility_level
    FROM sys.databases AS d
    WHERE d.name = DB_NAME();
    GO
    

    V případě potřeby aktualizujte úroveň na 130:

    ALTER DATABASE CURRENT
        SET COMPATIBILITY_LEVEL = 130;
    GO
    
  2. Pokud transakce zahrnuje tabulku založenou na disku i tabulku optimalizovanou pro paměť, je nezbytné, aby část transakce optimalizovaná pro paměť fungovala na úrovni izolace transakce s názvem SNAPSHOT. Chcete-li spolehlivě vynutit tuto úroveň pro tabulky optimalizované pro paměť v transakci mezi kontejnery, spusťte následující:

    ALTER DATABASE CURRENT
        SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON;
    GO
    
  3. Než budete moct vytvořit tabulku optimalizovanou pro paměť, musíte nejprve vytvořit skupinu souborů optimalizovanou pro paměť a kontejner pro datové soubory:

    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
    

Vytvoření tabulky optimalizované pro paměť

Primární úložiště pro tabulky optimalizované pro paměť je hlavní paměť, takže na rozdíl od tabulek založených na disku nemusí být data načtena z disku do vyrovnávací paměti. K vytvoření tabulky optimalizované pro paměť použijte klauzuli MEMORY_OPTIMIZED = ON.

  1. Spuštěním následujícího dotazu vytvořte paměťově optimalizovanou tabulku dbo.ShoppingCart. Ve výchozím nastavení se data uchovávají na disku pro účely stálosti (stálost je také možné nastavit tak, aby se zachovala pouze schémata).

    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. Vložte do tabulky několik záznamů:

    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);
    

Nativně zkompilované uložené procedury

SQL Server podporuje nativně zkompilované uložené procedury, které přistupují k tabulkám optimalizovaným pro paměť. Příkazy T-SQL se kompilují do strojového kódu a ukládají se jako nativní knihovny DLL, což umožňuje rychlejší přístup k datům a efektivnější spouštění dotazů než tradiční T-SQL. Uložené procedury označené NATIVE_COMPILATION se nativně kompilují.

  1. Spuštěním následujícího skriptu vytvořte nativně zkompilovanou uloženou proceduru, která vloží velký počet záznamů do tabulky 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. Vložit 1 000 000 řádků:

    EXECUTE usp_InsertSampleCarts 1000000;
    
  3. Ověřte, zda byly vloženy řádky:

    SELECT COUNT(*)
    FROM dbo.ShoppingCart;
    

Použití úložiště dotazů

Úložiště dotazů shromažďuje podrobné informace o výkonu dotazů, plánů spouštění a statistikách modulu runtime.

Před SQL Serverem 2022 (16.x) není úložiště dotazů ve výchozím nastavení povolené a dá se povolit pomocí příkazu ALTER DATABASE:

ALTER DATABASE AdventureWorks2022
    SET QUERY_STORE = ON;

Spuštěním následujícího dotazu vrátíte informace o dotazech a plánech v úložišti dotazů:

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;

Dotazování zobrazení dynamické správy

Zobrazení dynamické správy vrací informace o stavu serveru, které lze použít k monitorování stavu instance serveru, diagnostice problémů a ladění výkonu.

Pro dotazování dynamického zobrazení správy statistik dm_os_wait:

SELECT wait_type,
       wait_time_ms
FROM sys.dm_os_wait_stats;