tempdbの成長の原因となったSQLステートメントを見つける方法


26

サーバー(SQL Server 2008)のtempdbは、毎月数回500 GB以上に増加します。この問題の原因となったSQLステートメントを見つけることは可能ですか?問題は通常によって引き起こされていないcreate table #temp...; insert into #temp...select ... into #temp...が、複合体が結合します。

一部のtempdbファイルの初期サイズも、毎回自動的により大きな値に設定されます。それを防ぐ方法は?

キャッシュされたプランがファイルのサイズ変更/縮小を妨げる場合があります。どちらがtempdbを保持しているかを見つける方法は?


1
申し訳ありませんが、午前2時近くです。この質問に完全に回答するのはもうお気に召しませんが、他の回答を待つ間にこれらのURLが役立つ場合があります-mssqltips.com/sqlservertip/1432/…およびgoogle.com/search?q= which + queries + are + using + tempdb
アーロンバートランド

回答:


27

tempdbの使用状況を追跡するために使用できる3つのDMVがあります。

最初の2つでは、クエリおよびセッションレベルで割り当てを追跡できます。3番目は、バージョンストア、ユーザー、および内部オブジェクト全体の割り当てを追跡します。

次のクエリ例は、セッションごとの割り当てを示します。

SELECT
  sys.dm_exec_sessions.session_id AS [SESSION ID]
  ,DB_NAME(database_id) AS [DATABASE Name]
  ,HOST_NAME AS [System Name]
  ,program_name AS [Program Name]
  ,login_name AS [USER Name]
  ,status
  ,cpu_time AS [CPU TIME (in milisec)]
  ,total_scheduled_time AS [Total Scheduled TIME (in milisec)]
  ,total_elapsed_time AS    [Elapsed TIME (in milisec)]
  ,(memory_usage * 8)      AS [Memory USAGE (in KB)]
  ,(user_objects_alloc_page_count * 8) AS [SPACE Allocated FOR USER Objects (in KB)]
  ,(user_objects_dealloc_page_count * 8) AS [SPACE Deallocated FOR USER Objects (in KB)]
  ,(internal_objects_alloc_page_count * 8) AS [SPACE Allocated FOR Internal Objects (in KB)]
  ,(internal_objects_dealloc_page_count * 8) AS [SPACE Deallocated FOR Internal Objects (in KB)]
  ,CASE is_user_process
             WHEN 1      THEN 'user session'
             WHEN 0      THEN 'system session'
  END         AS [SESSION Type], row_count AS [ROW COUNT]
FROM 
  sys.dm_db_session_space_usage
INNER join
  sys.dm_exec_sessions
ON  sys.dm_db_session_space_usage.session_id = sys.dm_exec_sessions.session_id

一定期間の使用状況を追跡する場合は、Kendra Littleが示すように、sp_whoisactiveを使用してデータを収集することを検討してください


3
ありがとう。セッションの占有スペースと実際のスペースの違いは[SPACE Allocated FOR USER Objects (in KB)]あり[SPACE Deallocated FOR USER Objects (in KB)]ますか?
-u23432534

4

問題にはさまざまな原因が考えられます。

  • テーブル変数または一時テーブルの使用
  • sqlサーバーは、tempdbの作業テーブルとして中間結果セットを作成しました-通常、並べ替えの目的で使用されます(通常、インデックスが存在しないか、古い統計情報があります)
  • SQLサーバーは、テーブル値関数の結果セットを事前評価することを決定しました。この場合、データをtempdbに保存します
  • オプションを使用したインデックスの再作成 SORT_IN_TEMPDB = ON
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.