web-dev-qa-db-ja.com

SQLServerクエリがperfmonカウンターに設定するもの「最長トランザクション実行時間」> 0

このパフォーマンスカウンターを監視する価値があるかどうかを判断しようとしています:\\ SERVER\MSSQL:Transactions\Longest TransactionRunningTime。

そのため、テスト中に長時間実行されるトランザクションを作成しようとしましたが、このカウンターでゼロより大きい値を読み取ることができないようです。

しかし、それを実行するトランザクションまたはクエリが見つかりません。出発点として、 DBCC OPENTRAN のヘルプでサンプルクエリ(トランザクションへの挿入)を使用しましたが、運がありませんでした。

このカウンターに影響を与えるクエリはありますか?

2
Michael J Swart

パーティーに少し遅れた。過去6年間でこれに対する答えを説明するためにドキュメントが更新されたと思いますが、私のテストによれば、それは完全には正しくありません。

From Books Online : "他の現在のトランザクションよりも長くアクティブになっているトランザクションの開始からの時間(秒単位)。このカウンターはアクティビティのみを表示します。 )データベースが読み取りコミットスナップショット分離レベルにある場合。データベースが他の分離レベルにある場合、アクティビティはログに記録されません。」

私のテストによると、これは完全には正しくありません。 RCSIが有効になっていないが、スナップショットを許可している場合、SNAPSHOTクエリの実行中の最長のトランザクション時間が表示されます。

もう1つの注意点は、カウンターが60秒ごとにしか更新されないことです。

基本的に、スナップショットまたはRCSIを使用しているときに、バージョンストアのクリーンアップがブロックされるかどうかを監視するのに非常に役立ちます。

1
Kendra

このカウンターは少し遅い/ヒットして更新を見逃しているようです、そして私はそれが行うことを完全に確信していません正確にその説明が示唆していることですが、私は選択を行うことで最も成功したようですオープンエンドトランザクションのfrom(大きなテーブル)に。

おかしなことに、ロールバックを発行すると、カウンター統計がすぐに更新されるようで、コミットの効果が低く、どちらもなしで更新されることがありました。私が言っているように、このカウンターは私たちが考えているものとまったく同じではなく、単なる概算/平均である可能性があります。

よろしく、マーク@retracement

3
Mark Broadbent

これにより、そのカウンターに値が表示されます。明らかに手動で停止する必要があります。

SELECT '1' AS field1 INTO #tmp
BEGIN TRANSACTION
WHILE 1=1
BEGIN
    UPDATE #tmp SET field1=1
END
COMMIT TRANSACTION
DROP TABLE #tmp
1
squillman