このチュートリアルでは、OB Cloudが提供するリアルタイムSQL診断機能をすぐに体験できます。リアルタイムSQL診断は、可視化された方法でSQL実行プロセス中に実際の実行計画の状態をリアルタイムで照会・表示し、計画内の各演算子の実行時間とリソース使用状況を示します。これにより、SQLパフォーマンスの問題を迅速に調査するのに役立ちます。
説明
このチュートリアルは、OB Cloudコンソールでもインタラクティブなチュートリアルとして同時に公開されています。チュートリアルに従って、実際のOB Cloud環境でインタラクティブに体験することもできます。OB Cloudコンソールにログインした後、左側のナビゲーションバーの実践チュートリアルをクリックすると、公開されているすべてのインタラクティブチュートリアルを見ることができます。
前提条件
利用可能な分析型インスタンス(共有インスタンスまたはクラスタインスタンスのいずれか)があり、インスタンスのデータベースバージョンが4.3.3以上であること。
現在利用可能なインスタンスがない場合は、OB Cloudの無料トライアルインスタンスを開始することができます。クリックして無料トライアルのルールと開始方法を確認してください。
ご利用のOB Cloudアカウントのロール権限がプロジェクト管理者であること。
背景
分析処理のシナリオでは、SQLクエリに時間がかかることがあり、場合によっては分単位や時間単位に達することもあります。SQLのパフォーマンス問題は、システムの運用効率に影響を及ぼすだけでなく、開発進捗も遅らせます。特に分散データベースのマルチノード環境では、問題はさらに複雑になります。例えば、分散実行計画の問題が存在するかどうかを判断する方法は?実行を遅らせているノードを迅速に特定する方法は?このような問題は、単一マシンのデータベースでは比較的単純ですが、分散データベースでは複数のリンクとノードが関わるため、問題の特定が困難になります。
OB Cloudが提供するリアルタイムSQL診断機能は、SQL_PLAN_MONITORビューに基づき、各実行演算子の実行状況を収集し、スレッドの実行時間、I/O消費量などの詳細データをリアルタイムで表示することで、ユーザーがSQLパフォーマンスのボトルネックを迅速に特定し解決するのを支援します。
リアルタイムSQL診断機能には、以下の主要な特徴が含まれます:
- 実行が完了したSQL文の分析をサポートするだけでなく、実行中のSQL文に対するリアルタイム分析もサポートします。
- 実行計画のグラフィカルビュー、テーブルビュー、テキストビューを提供し、各演算子の実行順序と接続関係を明確に表示します。
- グローバルビューでは、Top 5の時間を消費する演算子を迅速に表示し、SQL文の実行にかかる全体の時間を集計することで、パフォーマンスボトルネックを素早く特定するのに役立ちます。
- パラレル実行計画については、DB時間、I/Oメモリ、出力行数でソートでき、データの偏りなどの問題を迅速に特定できます。分散実行計画の分析もサポートします。
- リアルタイムSQL診断インターフェースは、実行計画と全リンク診断を提供し、同一ページ上で詳細な実行解析を行うのに便利です。
ステップ1:ワークスペースの作成
OB Cloudコンソールのホームページの左側のナビゲーションバーで、データ開発 > ワークスペース を選択します。
ワークスペース ページで、ワークスペースの新規作成 をクリックします。
ワークスペースの新規作成 のポップアップウィンドウで、以下の設定を完了した後、新規作成 をクリックして、ワークスペースの作成を完了します。
パラメータ説明ワークスペース名 カスタムのワークスペース名。 関連するインスタンス 既存の分析型インスタンスを選択します。 データベースアカウント + アカウントを作成 をクリックし、新しいデータベースアカウントを作成してこのワークスペースに関連付けます。 パスワード 作成したばかりのデータベースアカウントのパスワードを入力します。
ステップ2:サンプルデータをインポートする
作業スペース一覧ページで、ステップ1で作成した作業スペース名をクリックし、作業スペースの詳細ページに移動します。
左側のナビゲーションバーで、サンプルデータセット をクリックし、TPC_H_1G カードを検索してクリックします。データセットの詳細ページに移動します。
インポート をクリックし、サンプルデータのインポート のポップアップウィンドウを開きます。
空のデータベースを選択 のドロップダウンメニューで、データベースの作成 をクリックします。
データベースの作成が完了したら、そのデータベースを選択し、インポート をクリックします。
インポートタスクの完了を待ち、インポート成功 のポップアップウィンドウで、ワークブックを開く をクリックして、データ開発ページに移動します。
ステップ3:スローSQLシナリオのシミュレーション
ここでは、典型的な特徴を持つSQLクエリを選択しました。このクエリはTPC-HベンチマークテストのQ20クエリであり、特定の条件を満たす特定の国(例:アルジェリア)のすべてのサプライヤーを検索することを目的としています。このクエリの特徴は、ソート、集計、INサブクエリ、および通常のサブクエリを含む2テーブルの結合操作です。これらの複雑なSQL操作は分散データベース環境では一般的であり、SQL実行時間が長くなりやすく、パフォーマンスボトルネックとなる原因となります。
ワークブックのエディターウィンドウに以下のサンプルSQLステートメントを入力します。
-- 指定された国(例:アルジェリア)で特定の条件を満たすサプライヤーを検索する SELECT s_name, -- サプライヤー名 s_address -- サプライヤー住所 FROM supplier, nation WHERE s_suppkey IN ( -- 条件を満たすサプライヤーを検索する SELECT ps_suppkey FROM partsupp WHERE ps_partkey IN ( -- 条件を満たす部品を検索する SELECT p_partkey FROM part WHERE p_name LIKE 'green%' -- 部品名は 'green' で始まる ) AND ps_availqty > ( -- サプライヤーの在庫が特定のしきい値(出荷数の半分)を超える場合 SELECT 0.5 * SUM(l_quantity) FROM lineitem WHERE l_partkey = ps_partkey AND l_suppkey = ps_suppkey AND l_shipdate >= DATE '1993-01-01' -- 出荷日付範囲の開始点 AND l_shipdate < DATE '1993-01-01' + INTERVAL '1' YEAR -- 出荷日付範囲の終点 ) ) AND s_nationkey = n_nationkey -- サプライヤーの所在国 AND n_name = 'ALGERIA' -- 指定国をアルジェリアとする ORDER BY s_name; -- サプライヤー名でソートする実行 ボタンをクリックしてこのクエリを実行します。このクエリには、複数テーブルの結合、ソート、サブクエリなどの操作が含まれており、時間がかかる可能性があります。
ステップ4:スローSQLの分析
クエリの実行が完了したら、行プロファイル ボタンをクリックして、SQL診断ページに移動します。
説明
クエリが遅い場合は、クエリの実行中に結果領域の 実行プロファイルを表示 をクリックすると、リアルタイムSQL診断ページを開くこともできます。
SQL診断ページで、実行詳細、実行プラン、または 完全なリンク診断 タブを選択すると、さまざまな観点からのSQL実行データを確認できます。
実行詳細 タブでは、ページ右側の 所要時間 Top5 リストから、実行時間が最も長い演算子を見つけてクリックすると、その演算子をすばやく特定し、詳細を確認できます。
実行計画図で、演算子下部の青いバーの長さを比較して、最も時間を消費する演算子を特定します。
ステップ5:SQL実行の最適化
SQL診断ページで提供される情報から、lineitem テーブルの全表スキャンがボトルネックであることがわかりました。そのため、関連列にインデックスを作成することにします。
SQL診断ページを閉じてワークブックのエディタページに戻り、新しいエディタウィンドウを開いて、以下のステートメントを実行し、
l_shipdate列にインデックスを作成します。ALTER TABLE lineitem ADD INDEX idx_lineitem_shipdate (l_shipdate);ステップ3で使用したSQLステートメントを再度実行し、実行時間が改善されているかどうか確認します。
クエリのパフォーマンスが依然として期待に達していない場合は、
l_partkey、l_suppkey、およびl_shipdateに対して複合インデックスを作成してみることができます。ALTER TABLE lineitem ADD INDEX idx_lineitem_partkey_suppkey_shipdate (l_partkey, l_suppkey, l_shipdate);再度ステップ3のクエリを実行し、Hash JoinがNested-Loop Joinに最適化され、実行時間がさらに短縮されているかどうか確認します。