web-dev-qa-db-ja.com

SQL Server TempDBをだます人/何を攻撃しているのかを見つける方法

SQL Server 2012 Enterpriseを使用しています。サーバーには1つの可用性グループが構成されています。インスタンスには、さまざまなツール用のデータベースがいくつかあります。ツールはすべて一緒に属するため、一緒にロールアウトされました。ロールアウト後、TempDBのperfmonカウンターTransaction/secの増加を認識しました。ロールアウト前は、カウンタは平均で30アラウンドでしたが、現在は約300です。過去に私はすでに同様の問題を抱えており、1つのツールの新しいリリースに、常に呼び出されるカーソルが実装されていることがわかりました。しかし今回はこれは問題ではないようです。 SQLプロファイラーを使用してカーソルイベントをトレースしましたが、興味深いものは見つかりませんでした。 tempDB自体のフィルターを使用してトレースを試みましたが、何も起こっていないようです。

TempDBでこれらの高いトランザクション率を引き起こしているのが誰であるか、または何が原因であるかを知る方法を誰かが知っていますか?

これがパフォーマンスの問題なのかどうかはわかりませんが、この数値がそれほど大きく変化した理由を知りたいと思います。

3
Tobi DM

Tempdbに多くのページがあるspidを確認するために、過去にこのスクリプトを使用しました。

;WITH s AS
(
    SELECT 
        s.session_id,
        [pages] = SUM(s.user_objects_alloc_page_count 
          + s.internal_objects_alloc_page_count) 
    FROM sys.dm_db_session_space_usage AS s
    GROUP BY s.session_id
    HAVING SUM(s.user_objects_alloc_page_count 
      + s.internal_objects_alloc_page_count) > 0
)
SELECT s.session_id, s.[pages], t.[text], 
  [statement] = COALESCE(NULLIF(
    SUBSTRING(
        t.[text], 
        r.statement_start_offset / 2, 
        CASE WHEN r.statement_end_offset < r.statement_start_offset 
        THEN 0 
        ELSE( r.statement_end_offset - r.statement_start_offset ) / 2 END
      ), ''
    ), t.[text])
FROM s
LEFT OUTER JOIN 
sys.dm_exec_requests AS r
ON s.session_id = r.session_id
OUTER APPLY sys.dm_exec_sql_text(r.plan_handle) AS t
ORDER BY s.[pages] DESC;

(申し訳ありませんが、どこから取得したか思い出せません)。これはあなたに犯人を与えません(彼が同じページを何度も書いている可能性があるためです)。

このスクリプトを使用すると、多くのIOを実行しているユーザーが得られます。

SELECT TOP 10 SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1,
((CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(qt.TEXT)
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2)+1),
qs.execution_count,
qs.total_logical_reads, qs.last_logical_reads,
qs.total_logical_writes, qs.last_logical_writes,
qs.total_worker_time,
qs.last_worker_time,
qs.total_elapsed_time/1000000 total_elapsed_time_in_S,
qs.last_elapsed_time/1000000 last_elapsed_time_in_S,
qs.last_execution_time,
qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
ORDER BY qs.total_logical_reads DESC -- logical reads
-- ORDER BY qs.total_logical_writes DESC -- logical writes
-- ORDER BY qs.total_worker_time DESC -- CPU time

Thanks Dave !)

これら2つを組み合わせると、良いアイデアが得られます。

3
Bart De Vos