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

適用対象:SQL Server - Linux

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

Note

次の例では、AdventureWorks2022 サンプル データベースを使用します。 このサンプル データベースを入手してインストールする手順については、Windows から Linux への SQL Server データベースの復元に関する記事を参照してください。

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

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

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

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

    SELECT ProductID, SUM(UnitPrice) SumUnitPrice, AVG(UnitPrice) AvgUnitPrice,
       SUM(OrderQty) SumOrderQty, AVG(OrderQty) 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 INT = 0
    
    WHILE @i < @InsertCount
       BEGIN
           INSERT INTO dbo.ShoppingCart VALUES (1, SYSDATETIME(), NULL)
    
           SET @i += 1
       END
    END
    
  2. 1,000,000 行を挿入します。

    EXEC 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
   JOIN sys.query_store_query AS Qry
      ON Pl.query_id = Qry.query_id
   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;

関連項目