web-dev-qa-db-ja.com

上位のクエリをプルすると、クエリプランとSQLテキストでNULLが返される

次のコードを使用して、上位20のクエリ(CPU順)を取得します。

SELECT TOP 20 qs.sql_handle
    ,qs.execution_count
    ,qs.total_worker_time AS [Total CPU]
    ,qs.total_worker_time / 1000000 AS [Total CPU in Seconds]
    ,(qs.total_worker_time / 1000000) / qs.execution_count AS [Average CPU in Seconds]
    ,qs.total_elapsed_time
    ,qs.total_elapsed_time / 1000000 AS [Total Elapsed Time in Seconds]
    ,st.TEXT
    ,qp.query_plan
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp
ORDER BY qs.total_worker_time DESC

しかし、私はこれを見ています: enter image description here

クエリプランとSQLテキストがNULLと表示される理由を誰かが理解できますか?それらは何らかのシステムプロセスですか、それとも外部アプリケーションですか? SQL 2008 R2を実行しています。

いつもありがとうございます。

4

ステートメントテキストがNULLであるという点で、sys.dm_exec_sql_textからテキストを選択すると、textの値は 暗号化されたオブジェクトの場合はNULL になります。

sys.dm_exec_sql_textのレコードのencrypted値を確認してください。

6
Mark Sinkinson

sys.dm_exec_query_planの使用には制限があります

5.4 Sys.dm_exec_text_query_planをいつどのように使用するか

Sys.dm_exec_query_planによって返されるquery_plan列はXML型であり、128以上のネストレベルを持つことができないというデータ型の固有の制限があります。SQLServer 2005ではRTM and SP1 、query_planの深さが128レベル以上の場合、これはクエリが返されないようにします。2番目の制限は、解析せずにDMVから直接、バッチ内の特定のステートメントのクエリプランを取得することが容易ではないことです。 sys.dm_exec_query_planから返されたクエリプランXML。

これらの両方の制限に対処するために、SQL Server 2005 SP2ではsys.dm_exec_text_query_planを導入しました。 Sys.dm_exec_text_query_planは、plan_handle、statement_start_offset、statement_end_offsetの3つのパラメーターを受け取るTVFです。バッチまたはバッチ内の特定のステートメントのテキスト形式でプラン表示を返します。

ホイールの再発明 の代わりに、 Brent's-sp_BlitzCache または Glennの診断クエリ または Aaronの回答はこちら

From DMVを使用したSQL Serverクエリパフォーマンス分析

-- Which Queries are taking the most time/cpu to execute
SELECT TOP 20
    total_worker_time, total_elapsed_time,
    total_worker_time/execution_count AS avg_cpu_cost, execution_count,
    (SELECT DB_NAME(dbid) + ISNULL('..' + OBJECT_NAME(objectid), '')
        FROM sys.dm_exec_sql_text([sql_handle])) AS query_database,
    (SELECT SUBSTRING(est.[text], statement_start_offset/2 + 1,
        (CASE WHEN statement_end_offset = -1
            THEN LEN(CONVERT(nvarchar(max), est.[text])) * 2
            ELSE statement_end_offset
            END - statement_start_offset) / 2
        )
        FROM sys.dm_exec_sql_text([sql_handle]) AS est) AS query_text,
    total_logical_reads/execution_count AS avg_logical_reads,
    total_logical_writes/execution_count AS avg_logical_writes,
    last_worker_time, min_worker_time, max_worker_time,
    last_elapsed_time, min_elapsed_time, max_elapsed_time,
    plan_generation_num, qp.query_plan
FROM sys.dm_exec_query_stats
    OUTER APPLY sys.dm_exec_query_plan([plan_handle]) AS qp
WHERE [dbid] >= 5 AND DB_NAME(dbid) IS NOT NULL
  AND (total_worker_time/execution_count) > 100
--ORDER BY avg_cpu_cost DESC;
--ORDER BY execution_count DESC;
ORDER BY total_worker_time DESC;
6
Kin Shah