sql >> データベース >  >> RDS >> Sqlserver

SQLServerの実行プランを読み取って分析する方法

    SQL Server実行プランは、データベースの専門家向けのクエリオプティマイザーとクエリ実行のゲートウェイです。クエリ処理と、影響を受けるテーブル、インデックス、統計、結合の種類、影響を受ける行の数、クエリ処理、データの並べ替え、データの取得などの関連するフェーズが明らかになります。

    過去の記事、SQL Server実行プラン—それは何であり、パフォーマンスの問題にどのように役立ちますか?高レベルのクエリ実行ワークフロー、さまざまなタイプの実行プラン(グラフィック、XML、テキスト)、および実際の実行プランと推定された実行プランについて検討しました。

    次に、SQL Serverの実行プランを評価するときに知っておく必要のあることと、情報を最適に解釈する方法について説明します。

    グラフィカルSQLServer実行プランの読み取り

    一般的に、私たちは実行計画を右から左に読みます。右上の実行プラン演算子から始めて、左に移動します。クエリの論理データフローを追跡するのに役立ちます。

    [AdventureWorks2019]サンプルデータベースで次のクエリを実行し、実際の実行プランを表示するとします。

    SELECT TOP (10) [SalesOrderID] [SalesOrderDetailID] [CarrierTrackingNumber] [OrderQty] [ProductID] [SpecialOfferID] [ModifiedDate] FROM [AdventureWorks2019].[Sales].[SalesOrderDetail] where [UnitPrice]>1000

    このクエリは、単価が1,000を超える注文の[Sales]。[SalesOrderDetail]テーブルからデータを取得します。

    実行計画を右から左に読むと、次のことに注意してください。

    • 最初の演算子は、[Sales]。[SalesOrderDetail]テーブルからデータを読み取るクラスター化インデックススキャンです。 Clustered Index ScanとTop演算子を結ぶ矢印にマウスポインタを合わせると、推定行数と実際の行数、および推定データサイズが返されます。

    • Clustered Index ScanオペレーターからTopオペレーターにデータを渡し、10行をSELECTオペレーターに渡します。

    内部的には、SQLServerは計画を左から右に実行します。オペレーターの物理的な注文に関心がある場合は、実行計画を左から右に読む必要があります。各オペレーターは、次のオペレーターにデータを要求します。たとえば、上記のシナリオでは、Topオペレーターがクラスター化インデックススキャンからデータを要求します。 Clustered Index Scanは、[Sales]。[SalesOrderDetail]テーブルから Whereを満たす行を返します。 条項条件。

    複数のブランチが実行プランでマージされる場合は、右から左、上から下のアプローチに従う必要があります。

    オペレーターの費用

    SQL Server実行プランの各オペレーターは、コストに関連付けられています。オペレーターのコストは、実行計画の他のコストと比較しています。通常、コストのかかるオペレーターとその周りのクエリの調整に集中する必要があります。

    複雑な実行計画の場合、コストのかかるオペレーターを特定するのは難しいかもしれません。この場合、 SET SHOWPLAN_ALL ONを使用できます 表形式で情報を提供します。

    [Stmt text]を使用して、各演算子およびステートメントレベルで実行プランを分類することもできます。

    SQL Server Management Studio(SSMS)は、検索条件に基づいてオペレーターを見つける柔軟性も提供します。これを行うには、実行プランを右クリックして、[ノードの検索]を選択します。 これにより、さまざまな検索条件のウィンドウが開きます。要件を指定すると、以下に示すように、特定のノードを指します。

    または、Azure Data Studioを使用して、実際のプランで現在のクエリを実行するに移動することもできます。 コマンドパレットの下。これにより、実際の実行計画がコンパクトな形式で提供され、コストのかかるオペレーターをすばやく特定するための上位の操作が提供されます。

    ショープラン分析

    不正確なカーディナリティ推定を特定して、問題のある実行計画を調査できます。これにより、[ShowPlanAnalysis]タブで特定のオペレーターと推奨事項を見つけるための簡単な情報が得られます。結果を差分列、実際の列、および推定列で並べ替えて、実行プラン内の特定のオペレーターの問題と推奨事項を見つけることができます。これはSSMS17.4から入手できます。

    これを行うには、実行プランを右クリックして、[実際の実行プランを分析する]をクリックします。

    次に、詳細の検索の下にあるハイパーリンクをクリックします 。これは、推定の不正確さの考えられるシナリオと、これらの推定を改善するための回避策を説明します。これは、カーディナリティ推定の問題の良い出発点です。

    ショープランの比較

    実行計画で問題を特定し、それを修正するためのソリューションを実装したとします。しかし、以前の実行計画(ソリューションを実装する前の状態)と現在の実行計画をどのように比較しますか? SSMS比較ショープラン この機能により、2つの実行計画を柔軟に比較できます。これらの計画の類似点と相違点を強調しています。

    通常、DBAは開発者から、特定のクエリは本番環境では正常に機能しているが、同じパラメーターを使用するQA環境では長い時間がかかるという電話を受けます。もう1つの使用例は、SQLServerの新しいバージョンへの移行です。移行後、SQLバージョンが低い場合に正常に機能するクエリで問題が発生したとします。このツールを使用して、さまざまなSQLバージョンとパッチレベルの実行プランを比較することもできます。

    実行プランをSQLPlanに保存します 拡大。その後、別の実行プランを右クリックして、[ショープランの比較]を選択できます。 。

    SSMSでのライブ実行プラン

    アクティブなクエリのライブ実行プランを有効にできます。これにより、さまざまなオペレーターへのデータフローに関するリアルタイムの統計が得られます。実行時実行統計では、経過時間と行数を追跡できます。これは、パフォーマンスの問題のトラブルシューティングとデバッグに最適な機能です。 SQLServer2016以降のライブクエリ統計を使用できます。

    注:SSMSの最新バージョンを使用する必要があります。 SSMSの最新バージョンをダウンロードするには、Microsoftのドキュメントを参照してください。

    • 現在の最新バージョン:SSMS 18.7.1

    ライブクエリの統計情報については、ライブクエリの統計情報を含めるをオンにします SSMSツールバーを使用します。

    Activity Monitorからライブ実行プランを表示することもできます 。アクティビティモニターで目的のプロセスを選択し、右クリックしてメニューを表示し、ライブ実行プランを表示するを選択します。

    これにより、個々のオペレーターのデータフローと完了率とともに、ライブクエリの見積もりが得られます。通常、クエリの実行が終了するのを待って、実際の実行プランを表示します。ただし、クエリが結果を生成するのに30分以上かかるとします。この場合、ライブクエリ統計を使用して、個々のオペレーター、データフローを追跡し、クエリの完了に時間がかかっているオペレーターを特定できます。たとえば、以下に示すように、クエリは12分48秒間実行され、クエリは20%完了したと推定されます。オペレーターレベルでは、インデックススキャンと行カウントスプールが41%完了しています。点線はデータの移動を示しています。

    SQLServer実行プランの使用状況の確認

    SQL Serverの実行プランは、遅いクエリのトラブルシューティングと最適化に非常に役立ちます。すべてのデータベースの専門家は、実行プランが利用可能になったら、情報を分析して理解する方法を知る必要があります。前に説明したように、SSMSとAzure Data Studioには、パフォーマンスの問題を確認して解決するのに役立つさまざまなツールがあります。特に、プランの比較機能は、変更を加えてパフォーマンスを評価するときに利用できるツールです。


    1. SQL ServerでCHECK制約を作成する方法(T-SQLの例)

    2. SQL内部結合

    3. 別の列のMAX値に対応する列値を取得するSQLクエリ?

    4. Oracleで文字列の一部を削除する方法