サーバー(SQL Server 2008)のtempdbは、毎月数回500 GB以上に増加します。この問題の原因となったSQLステートメントを見つけることはできますか?通常、問題の原因はcreate table #temp...; insert into #temp...
またはselect ... into #temp...
ではなく、複雑な結合です。
一部のtempdbファイルの初期サイズも、毎回自動的にはるかに大きな値に設定されます。それを防ぐ方法は?
キャッシュされたプランがファイルのサイズ変更/縮小を妨げる場合があります。 tempdbを保持するものを見つける方法は?
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 でデータを収集することを検討してください。
問題にはさまざまな原因が考えられます。
SORT_IN_TEMPDB = ON
を使用したインデックスの再作成