Amazon Web Services ブログ

Amazon RDS for SQL Server における Performance Insights でのクエリ性能のモニタリング

Amazon RDS Performance InsightsAmazon Relational Database Service (Amazon RDS) の強力な機能で、データベースのパフォーマンスに関するリアルタイムおよび過去のインサイトを提供します。パフォーマンスボトルネックのトラブルシューティング、遅いクエリの特定、システムの最適化など、どのような目的でも Performance Insights は役に立ちます。Performance Insights を使用するとデータベースの動作をより深く理解できます。Performance Insights は既存の Amazon RDS モニタリング機能を拡張したもので、データベースのパフォーマンスを示し、分析するのに役立ちます。Performance Insights ダッシュボードでは、RDS DB インスタンスの負荷をアプリケーション、データベース、待機イベント、SQL ステートメント、ホスト、またはユーザーごとに細分化して視覚化することができます。

この投稿では、最近リリースされた Performance Insights の新機能について説明します。

  • SQL ダイジェストと SQL 統計
  • Performance Insights for SQL Server によるクエリ実行プラン

SQL ダイジェストと SQL 統計

これらの新機能について説明する前に、一般的な SQL ダイジェストについて説明しましょう。SQL ダイジェストは、構造的には似ていてもリテラル値が異なる可能性がある複数の実際のクエリを組み合わせたものです。ダイジェストは SQL クエリのバインド値を疑問符に置き換えます。たとえば、ダイジェストは SELECT * FROM emp WHERE lname=? というような場合があります。このダイジェストには次の子クエリが含まれる場合があります。

SELECT * FROM emp WHERE lname = 'Sanchez';
SELECT * FROM emp WHERE lname = 'Olagappan';
SELECT * FROM emp WHERE lname = 'Wu';
SQL

ダイジェスト内のリテラル SQL ステートメントを表示するには、クエリを選択し、プラス記号を選択して詳細を展開します。次の例では、選択されたクエリはダイジェストです。

ただし、SQL Server はオープンソースエンジンのようなダイジェストをサポートしていません。ダイジェストテキストは、どのような種類のクエリがデータベースのパフォーマンスに最も大きな影響を与えているかを理解するのに役立ちます。SQL Server では、各ダイジェストは特定の query_hash に関連付けられています。

クエリで計算された query_hash またはバイナリハッシュ値は、同様のロジックを持つクエリを識別するために使用されます。query_hash を使用すると、リテラル値のみが異なるクエリのリソース使用量の合計を判断できます。query_hash は、リテラル値に関係なく、クエリを指す計算値です。例を次に示します。

SQL Text: select col1,1,col2 
          from table1 
          where col345465757e <> 456;

DIGEST_TEXT: select col1,?,col2 
             from table1 
             where col345465757e <> ?
SQL

Amazon RDS for SQL Server は、上位の SQL クエリについて、ステートメントレベルとダイジェストレベルの両方で SQL 統計を収集します。詳細については、「SQL Server の SQL 統計」を参照してください。

クエリ実行プラン

Performance Insights は、推定されたクエリ実行プランのみをキャプチャします。キャプチャされたプランには、すべてのプランノードと統計が含まれます。詳細については、「Performance Insights ダッシュボードを使用した実行プランの分析」を参照してください。

キャプチャされた実行プランは、次の 2 つの形式で表示できます。

  • 表形式 – プランノードと統計情報をすばやく把握できる
  • ダウンロード可能な XML 形式SQL Server Management Studio のようなツールを使用して詳細な調査を行う

Performance Insights が収集する実行プランの詳細は、次のことに役立ちます。

  • 上位の SQL クエリでどのプランが使用されているかを調べる
  • 同じクエリで異なるプランを比較する
  • クエリがいつ新しいプランに切り替わったかを調べる
  • コストが最も高いプランの特定の演算子を絞り込む

ソリューション概要

以下のセクションでは、Performance Insights ダッシュボードを使用して RDS DB インスタンスに接続し、データベースを準備して SQL Server 実行プランを分析する方法を示します。

前提条件

開始する前に、次の前提条件を完了していることを確認してください。

  1. RDB DB インスタンスを作成します。
  2. Performance Insights を有効にします
  3. Performance Insights のアクセスポリシーを構成します
  4. SQL Server Management Studio (SSMS) がインストールされた Amazon Elastic Compute Cloud (Amazon EC2) Windows インスタンスを用意します。

RDS DB インスタンスに接続し、データベースを準備する

まず、サンプルデータベースとテーブルを作成します。以下のステップを完了します。

  1. SSMS を開きます。
  2. RDS for SQL Server データベースインスタンスに接続します。
  3. 「新しいクエリ」を開きます。
  4. 次のクエリを入力し、「実行」をクリックします。
    -- Create database 
    CREATE DATABASE testDB   
    Go    
    -- Create Customers table
    CREATE TABLE Customers (
        CustomerID INT PRIMARY KEY,
        CustomerName NVARCHAR(100)
    );
    
    -- Insert ten thousand rows into Customers table
    DECLARE @CustomerCounter INT = 1;
    WHILE @CustomerCounter <= 10000
    BEGIN
        INSERT INTO Customers (CustomerID, CustomerName)
        VALUES (@CustomerCounter, 'Customer' + CAST(@CustomerCounter AS NVARCHAR(10)));
        SET @CustomerCounter = @CustomerCounter + 1;
    END;
    
    -- Create Products table
    CREATE TABLE Products (
        ProductID INT PRIMARY KEY,
        ProductName NVARCHAR(100),
        UnitPrice DECIMAL(10, 2)
    );
    
    -- Insert ten thousand rows into Products table
    DECLARE @ProductCounter INT = 1;
    WHILE @ProductCounter <= 10000
    BEGIN
        INSERT INTO Products (ProductID, ProductName, UnitPrice)
        VALUES (@ProductCounter, 'Product' + CAST(@ProductCounter AS NVARCHAR(10)), RAND() * 100);
        SET @ProductCounter = @ProductCounter + 1;
    END;
    
    -- Create Orders table
    CREATE TABLE Orders (
        OrderID INT PRIMARY KEY,
        CustomerID INT,
        OrderDate DATE
    );
    
    -- Insert ten thousand rows into Orders table
    DECLARE @OrderCounter INT = 1;
    WHILE @OrderCounter <= 10000
    BEGIN
        INSERT INTO Orders (OrderID, CustomerID, OrderDate)
        VALUES (@OrderCounter, (ABS(CHECKSUM(NEWID())) % 1000000) + 1, DATEADD(DAY, -(@OrderCounter % 365), GETDATE()));
        SET @OrderCounter = @OrderCounter + 1;
    END;
    
    -- Create OrderDetails table
    CREATE TABLE OrderDetails (
        OrderDetailID INT PRIMARY KEY,
        OrderID INT,
        ProductID INT,
        Quantity INT
    );
    SQL
  5. 次のステートメントを使用して SHOWPLAN_XML を有効にします。
    -- Display XML execution plan for a query 
    SET SHOWPLAN_XML ON;
    GO
    SQL

デモで使用するサンプルクエリは次のとおりです。

Where 句を使用している QUERY 1

SELECT Orders.OrderID FROM Orders WHERE Orders.OrderDate BETWEEN '2023-01-01' AND '2023-12-31'
SQL

join を使用している QUERY 2

SELECT 
    Orders.OrderID,
    Customers.CustomerName,
    SUM(OrderDetails.Quantity * Products.UnitPrice) AS TotalPrice
FROM 
    Orders
JOIN 
    Customers ON Orders.CustomerID = Customers.CustomerID
JOIN 
    OrderDetails ON Orders.OrderID = OrderDetails.OrderID
JOIN 
    Products ON OrderDetails.ProductID = Products.ProductID
WHERE 
    Orders.OrderDate BETWEEN '2023-01-01' AND '2023-12-31'
GROUP BY 
    Orders.OrderID, Customers.CustomerName
HAVING 
    SUM(OrderDetails.Quantity * Products.UnitPrice) > 1000;
SQL

Performance Insights ダッシュボードを利用した SQL Server のクエリ実行プラン分析

SQL Server のクエリ実行プランを分析するには、次の手順を実行します。

  1. Amazon RDS コンソールのナビゲーションペインで、「Performance Insights」を選択します。
  2. SQL Server DB インスタンスを選択します。
    その DB インスタンスのパフォーマンスインサイトダッシュボードが表示されます。
  3. [データベース負荷] セクションで、「分類方法」の横のドロップダウンメニューで「プラン」を選択します。
    データベース負荷チャートには、上位の SQL ステートメントで使用されるプランと、それらのプランによってデータベースで発生した負荷が表示されます。プランのハッシュ値は、色分けされた四角形の右側に表示されます。各ハッシュ値はプランを一意に識別します。
  4. 歯車アイコンを選択し、[Total elapsed time/exec]、[Rows processed/sec]、[Plans count (unique)] など、関心のあるフィールドを選択します。
  5. 「トップSQL」セクションで、「SQL テキスト」タブを選択して SQL ステートメント全体を表示します。

  6. 「プラン」タブを選択して、クエリ実行プランを分析します。

この記事の例は、実行プランの比較を深く掘り下げることを意図したものではありません。むしろ、これらのプランを分析するための Performance Insights ダッシュボードの機能を紹介することを目的としています。私たちのアプローチは、基本的な機能を強調するために意図的に単純化しています。

結論

モニタリングは、Amazon RDS 上の SQL Server データベースの信頼性、可用性、パフォーマンスを維持する上で重要です。データベース管理者は、データベースエンジンがクエリをどのように処理するかを理解するために、常に SQL Server の統計とクエリ実行プランの分析に頼ってきました。Performance Insights ダッシュボードに SQL Server の統計情報と実行プランが表示されるため、データベース管理者は SQL Server のパフォーマンスを微調整して、データベース運用を最適化し、システム全体の効率を高めることができるようになりました。この投稿では、実行プランごとにデータベース負荷を分析し、特定のクエリのさまざまなプランを比較する方法を紹介しました。

Performance Insights を使い始めるには、「Amazon RDS での Performance Insights を使用した DB 負荷のモニタリング」を参照してください。

翻訳はソリューションアーキテクトの Yoshinori Sawada が担当しました。原文はこちらです。


著者について

Sudarshan Roy は、AWS のシニアデータベーススペシャリストクラウドソリューションアーキテクトです。お客様向けの大規模なデータベース移行とモダナイゼーションの取り組みをリードし、データベースのワークロードを AWS クラウドに移行しながら複雑な移行の課題を解決することに注力しています。

Sudhir Amin は、アマゾンウェブサービスのシニアソリューションアーキテクトです。ニューヨークを拠点にしてさまざまな業種のお客様にアーキテクチャの指導と技術支援を提供し、クラウドの採用を加速させています。彼はスヌーカー、ボクシングや UFC などの格闘技の大ファンで、野生生物保護区が豊富な国へ旅行をして世界で最も雄大な動物を間近で見ることが好きです。