次の方法で共有


SQL Server on Linux のパフォーマンス機能のチュートリアル

適用対象:SQL Server - Linux

SQL Server を初めて使用する Linux ユーザーの場合は、次のタスクを使い、パフォーマンス機能の一部について順を追って説明します。 これらは Linux 独自または固有のものではありませんが、さらに調べる領域について考えるヒントになります。 各例には、その領域の詳細なドキュメントのリンクが記載されています。

次の例では、AdventureWorks2022 サンプル データベースを使用します。 このサンプル データベースを入手してインストールする手順については、「バックアップと復元を利用して、SQL Server データベースを Windows から Linux に移行する」を参照してください。

列ストア インデックスを作成する

列ストア インデックスは、列ストアと呼ばれる列データ形式で大量のデータを格納し、クエリを実行するためのテクノロジです。

  1. 次の Transact-SQL コマンドを実行して、SalesOrderDetail テーブルに列ストア インデックスを追加します。

    CREATE NONCLUSTERED COLUMNSTORE INDEX [IX_SalesOrderDetail_ColumnStore]
        ON Sales.SalesOrderDetail(UnitPrice, OrderQty, ProductID);
    GO
    
  2. 列ストア インデックスを使用してテーブルをスキャンする次のクエリを実行します。

    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. 列ストア インデックスの object_id を調べ、それが 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');
    

インメモリ OLTP を使用する

SQL Server には、アプリケーション システムのパフォーマンスを大幅に改善できるインメモリ OLTP 機能があります。 このセクションでは、メモリに格納されたメモリ最適化テーブルと、コンパイルや解釈を必要とせずにそのテーブルにアクセスできるネイティブ コンパイルされたストアド プロシージャを作成する手順について説明します。

インメモリ OLTP のデータベースを構成する

  1. インメモリ OLTP を使用する場合、データベースの互換性レベルを 130 以上に設定するようにしてください。 AdventureWorks2022 の現在の互換性レベルを確認するには、次のクエリを使用します。

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

    必要に応じて、レベルを 130 に更新します。

    ALTER DATABASE CURRENT
        SET COMPATIBILITY_LEVEL = 130;
    GO
    
  2. トランザクションがディスクベースのテーブルとメモリ最適化テーブルの両方に関係する場合、トランザクションのメモリ最適化部分が SNAPSHOT というトランザクション分離レベルで動作することが不可欠です。 クロスコンテナー トランザクションのメモリ最適化テーブルにこのレベルを確実に適用するには、以下を実行します。

    ALTER DATABASE CURRENT
        SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON;
    GO
    
  3. メモリ最適化テーブルを作成する前に、まずメモリ最適化ファイル グループと、データ ファイル用コンテナーを作成する必要があります。

    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
    

メモリ最適化テーブルを作成する

メモリ最適化テーブルのプライマリ ストアはメイン メモリなので、ディスクベースのテーブルとは異なり、データをディスクからメモリ バッファーに読み込む必要はありません。 メモリ最適化テーブルを作成するには、MEMORY_OPTIMIZED = ON 句を使用します。

  1. 次のクエリを実行して、メモリ最適化テーブル dbo.ShoppingCart を作成します。 既定で、データは持続性のためにディスクに永続化されます (DURABILITY はスキーマのみを永続化するように設定することもできます)。

    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. テーブルにいくつかのレコードを挿入します。

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

ネイティブ コンパイル ストアド プロシージャ

SQL Server は、メモリ最適化テーブルにアクセスするネイティブ コンパイル ストアド プロシージャをサポートしています。 T-SQL ステートメントはマシン コードにコンパイルされ、ネイティブ DLL として保存されるので、従来の T-SQL よりも高速なデータ アクセスとより効率的なクエリ実行が可能になります。 NATIVE_COMPILATION が設定されているストアド プロシージャはネイティブでコンパイルされます。

  1. 次のスクリプトを実行して、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. 1,000,000 行を挿入します。

    EXECUTE usp_InsertSampleCarts 1000000;
    
  3. 行が挿入されたことを確認します。

    SELECT COUNT(*)
    FROM dbo.ShoppingCart;
    

クエリ ストアを使用する

クエリ ストアでは、クエリ、実行プラン、およびランタイム統計に関する詳細なパフォーマンス情報を収集します。

SQL Server 2022 (16.x) より前では、クエリ ストアは既定で有効ではなく、ALTER DATABASE を使って有効にできます。

ALTER DATABASE AdventureWorks2022
    SET QUERY_STORE = ON;

次のクエリを実行して、クエリ ストア内のクエリとプランに関する情報を返します。

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;

クエリ動的管理ビュー

動的管理ビューでは、サーバーの状態情報が返されます。返された情報は、サーバー インスタンスのヘルス状態の監視、問題の診断、パフォーマンスのチューニングに使用できます。

dm_os_wait stats 動的管理ビューのクエリを実行するには:

SELECT wait_type,
       wait_time_ms
FROM sys.dm_os_wait_stats;