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

UDFのショープランの機能強化

    Microsoftは、過去数回のリリースでSQL ServerのShowplanXML出力の内容を強化しており、SQL Server 2017 CU3では、XML出力のQueryTimeStatsノードにユーザー定義関数(UDF)実行統計を導入しました。これは、実際の実行プランのために、ServicePack2のSQLServer2016にもバックポートされました。この機能により、クエリのパフォーマンス特性の一部として、スカラーUDF実行の影響を明確に知ることができます。ただし、この機能の使用に関連する興味深い問題があります。最新バージョンのSQLServerManagementStudioまたはSentryOnePlanExplorerを使用して実際の実行プランを収集する必要があります。そうしないと、実行プランから情報が削除されます。

    さまざまなSSMSバージョンのプランの比較

    最近、シカゴでプランキャッシュを使用したクエリパフォーマンスの調整に関するユーザーグループセッションを紹介しました。セッション中は、当時のSQL ServerManagementStudioの最新リリースであるバージョン17.5を使用していました。当時、VMをSQL Server 2016 Service Pack 2に更新したので、実際のショープランQueryTimeStatsで新しいUdfElapsedTimeとUdfCpuTimeの情報を示し、thmに関する記事を書くようにメモしました。まったく同じVMでまったく同じクエリを使用してこの記事を実際に開始するために戻ったとき、何度も試行したにもかかわらず、UdfElapsedTimeまたはUdfCpuTime情報を含む実際の実行プランを生成できませんでした。何が間違っているのか理解できず、問題の根本は、SQL Server ManagementStudio17.5ではなくSQLServerManagementStudio2016を誤って起動したことであることが判明しました。 SSMS 17.5で同じクエリを実行すると、突然UdfElapsedTimeとUdfCpuTimeの情報が返されました。両方のSSMSバージョンから返されるXMLの例については、以下を参照してください。

    SSMSからのShowplanXML 17.5

    SSMSからのShowplanXML 2016 –WaitStatsとQueryTimeStatsは完全に削除されました

    Microsoft Message Analyzerを使用して、SSMS2016を実行しているクライアントとSQLServer 2016 SP2インスタンスの間のポート1433でネットワークトラフィックのTCPトレースを生成し、サーバーからクライアントに送信されるTDSパケットをキャプチャしました。これにより、サーバーから返されたShowPlanXMLには、SSMS 2016のShowPlanXMLには表示されないにもかかわらず、QueryTimeStats情報が含まれていることがわかります。したがって、クライアントは、クライアントに付属のスキーマ定義に含まれていないフィールドを実際に削除しています。

    メッセージオフセット:1635
    <.Q.u.e.r.y.T.i.m.e.S.t.a.t.s。 .E.l.a.p.s.e.d.T.i.m.e。=。".2.6.7。"。 .C.p.u.T.i.m.e。=。".2.6.7。"。 .U.d.f.E.l.a.p.s.e.d.T.i.m.e。=。"。2.1.5。"。 .U.d.f.C.p.u.T.i.m.e。=。"。2.1.5。"。>。<./。Q.u.e.r.y.T.i.m.e.S.t.a.t.s.>

    これは、古いバージョンのSSMSを使用して生成された.sqlplanファイルや、古いバージョンのSSMSから保存またはコピーされた実行プランで注意する必要があります。これは、次の方法でクライアントを操作しているときによく発生します。 Eメール。

    SSMSでは、グラフィカルな実行プランを見ても、クエリでのスカラーユーザー定義関数の実行によるパフォーマンスへの影響はわかりません。

    パフォーマンスの分析を各オペレーターのコストに厳密に基づいている場合、関数実行のComputeScalarはパフォーマンスに大きな影響を与えるようには見えません。オペレーター向けのツールチップも、情報を具体化したり、ユーザー定義関数の影響に関する警告を含んだりしません。 SSMS内の情報が現在確認できる唯一の場所は、以下に示すように、プランのXML、またはプランのSELECTルート演算子の[プロパティ]ウィンドウにあります。

    ただし、ここでの情報を使用すると、UdfCpuTimeは合計CpuTimeの85.79%であり、UdfElapsedTimeはクエリの実行の合計ElapsedTimeの64.44%であることがわかります(QueryTimeStats CpuTimeとUdfCpuTime(上の青)、およびElapsedTimeとUdfElapsedTime)。

    SentryOneプランエクスプローラーを使用したプランの取得

    SQLServerのパフォーマンス調整を支援するための私のお気に入りの無料ツールの1つはSentryOneプランエクスプローラーです。プランエクスプローラーの長い間機能の1つは、コマンドテキストを新しいウィンドウに貼り付けて実際の実行プランを生成する機能です。以下に示すように、[実際の計画を取得]ボタンをクリックします。

    PlanExplorerはSQLServerエンジンによって提供されるShowplanXMLを読み取るため、QueryTimeStatsに拡張情報も含まれます。ただし、古いバージョンのManagement Studioから保存された実行プランを開いた場合、または古いバージョンでSSMS用のプランエクスプローラーアドインを使用してプランエクスプローラーでプランを表示した場合、拡張情報は表示されません。

    プランエクスプローラーの[結果]タブの[ステートメント]グリッドは、列の選択を使用して更新し、グリッド内の既存の列に加えてUDF期間とUDF CPU列を追加して、ユーザー定義の関数の実行が影響を及ぼしている場所を簡単に確認できます。大規模なマルチステートメントバッチの場合。 Plan Explorerは、以下に示すように、CPU全体および/または期間の重要な部分である場合に、これらの列の強調表示も提供します。

    プランエクスプローラのプラン図情報も強化されました。 CPU + I / Oごとのコスト、次にCPUごとのコストを使用した図は次のとおりです。

    コストを使用した計画図CPU + I/O別

    コストを使用した計画図CPU別

    ユーザー定義関数の実行統計が、CPU全体および/または期間全体の重要な部分であることを示している場合、ルートSELECT演算子に追加の警告があります。

    ルートのツールチップSELECT演算子

    Compute Scalarオペレーターには、ShowplanXMLの拡張機能が含まれていないプランの場合でも、操作によって処理されている行数に基づいてプランエクスプローラーに警告が表示されます。

    コンピューティングのツールチップスカラー演算子

    CPUごとにコストを表示すると、I/Oによって溺れる可能性のある隠れたCPUコストを持つオペレーターを特定するのに役立ちます。ビューをわずかにシフトしてCPUまたはI/Oのいずれかを単独でトラブルシューティングするこの機能は、PlanExplorerとSSMSの多くの差別化要因の1つです。このビューを変更できる図のコンテキストメニューは次のとおりです。

    結論

    SQLServerのShowplanXMLの機能強化により、SQL Server 2016 ServicePack2およびSQLServer2017 Cumulative Update3のクエリパフォーマンスに対するスカラーユーザー定義関数の全体的な影響を判断するのがはるかに簡単になります。実行プランを取得するためのクライアントツールまたはプランエクスプローラーの最新バージョン。


    1. TNS-12505:TNS:listenerは現在、接続記述子で指定されたSIDを認識していません

    2. 致命的なエラー:nullでメンバー関数query()を呼び出す

    3. MSSQLServerで完了したタスクに関する自動データ収集

    4. 結果セットをSQL配列から文字列の配列に変換します