MS SQL ServerのTempDBとは何ですか?
TempDBは、内部オブジェクト、行バージョン、作業テーブル、一時テーブル、およびインデックスのストアとして使用されるMicrosoftSQLServerのシステムデータベースです。 TempDBは、SQL Serverインスタンス(グローバルリソース)に接続しているすべての参加者が使用できます。他のデータベースフレーバーに精通している人にとって、tempDBデータベースはOracleのTEMPテーブルスペースに似ています。控えめに言って、インスタンスメモリに収まらないものはすべてtempdbデータファイルに波及します。
TempDBは通常、次の場合に使用されます。
- 一時テーブルは#命名規則で作成されます。私の店では、これらの規則をたくさん作成する1つまたは2つのアプリケーションを見てきました。その結果、パフォーマンスに影響を与える可能性があります。 TempDBは、一時テーブルごとに、サイズがテーブルサイズに依存するページを配布します。さらに、複数の同時セッションがそのようなTempTableを同時に作成している場合、いくつかの競合が発生する可能性があります。
- READ_COMMITTED_SNAPSHOT分離レベルが有効になっています。深刻な数のデッドロックが発生しているアプリケーションが2つあったため、数年前に2つのインスタンスでこれを実行する必要がありました。スナップショットアイソレーションレベルを使用することは、特に適切なコーディングについて開発者と行き来したくない場合に、デッドロックに対処する1つの方法です。これはパフォーマンスの向上に役立つと期待されていることに注意してください。ただし、楽観的同時実行制御を使用しているため、データの整合性に関してすべての場合に望ましいとは限りません。
- インデックスは、SORT_IN_TEMPDB=ONオプションを使用して構築または再構築されます。再構築プロセスの進行中に、インデックスを所有するデータベースから並べ替えの負担を取り除く傾向があります。このオプションがインスタンスのパフォーマンス全体に与える全体的な影響を調べると役立つ場合があります。
- 複数のアクティブな結果セット(MARS)機能が有効になります。いいえ、MARSはこのシナリオでは惑星ではありません。これは、アプリケーションが単一の接続を介して複数のバッチを送信できるようにする機能です。デフォルトでは無効になっており、 MultipleActiveResultSets =Trueを含めることで明示的に有効にできます。 接続文字列に。
- 内部的には、SQL ServerはTempDBを使用して、カーソル操作で一般的に使用される作業テーブル(GROUP BY、ORDER BY、またはUNION句による呼び出し)を作成しました。作業テーブルは、ユーザーアクティビティによって直接作成されるのではなく、SQLServerエンジンアクティビティによって作成される一時テーブルと考えることができます。
関連する動的管理ビューSQLServer
次の関連する動的管理ビュー(DMV)は、TempDBのアクティビティを調査するときに役立ちます。
- sys.dm_db_file_space_usage :このDMVは、関心のあるデータベース内のファイルのスペース使用量に関する情報を返します。これを使用して、インスタンス内の任意のデータベースを調べることができ、出力はそのデータベースにのみ関係します。この記事のコンテキストでは、DMVを使用してTempDBを調べます。
- sys.dm_db_session_space_usage :このDMVはTempDBデータベース専用であり、特定のデータベースの各セッションによって割り当ておよび割り当て解除されたページ数を返します。ページの割り当ては通常、セッションが終了するまで維持されます。
- sys.dm_db_task_space_usage :このDMVもTempDBデータベース専用であり、特定のデータベースの各タスクによって割り当ておよび割り当て解除されたページ数に関する情報を提供します。
- sys.dm_tran_active_snapshot_database_transactions :このDMVは、行バージョンを生成してアクセスする可能性のあるアクティブなトランザクションを返します。このビューは、ALLOW_SNAPSHOT_ISOLATIONやREAD_COMMITTED_SNAPSHOTなどのオプションが有効になっている場合に関連します。
- sys.dm_tran_version_store :このDMVは、バージョンストア内のすべてのバージョンレコードに関する情報を提供します。アクティブな実稼働サーバーでは、このテーブルのレコードが大幅に増える可能性があります。したがって、DMVを照会するときは注意する必要があります。
TempDBデータベースを使用する前にDMVコマンドを調べる
sys.dm_file_space_usage
これらのDMVの説明は、Microsoftのドキュメントから入手できます。
表1に、 sys.dm_file_space_usageの説明を示します。 。リスト1のクエリは、TempDBデータベースとWideWorldImportersデータベースのファイルスペース使用量をそれぞれ表示します。写真1と2は、それぞれTempDBデータベースとWideWorldImportersデータベースの両方でこのクエリの出力を返します。
[テーブルID=44 /]
表1: sys.dm_file_space_usageの説明
-- List 1: Check space usage on database files -- Check space usage on tempdb use tempdb go select db_name(database_id) [Database_name] ,file_name(file_id) [File_name] ,filegroup_id ,total_page_count [TPC] ,total_page_count*8/1024 [TSU (MB)] ,allocated_extent_page_count [AEPC] ,allocated_extent_page_count*8/1024 [AEPC (MB)] ,version_store_reserved_page_count [VSRP] ,version_store_reserved_page_count*8/1024 [VSRP (MB)] ,user_object_reserved_page_count [UORP] ,user_object_reserved_page_count*8/1024 [UORPC (MB)] ,internal_object_reserved_page_count [IORPC] ,internal_object_reserved_page_count*8/1024 [UORPC (MB)] ,mixed_extent_page_count [MEPC] ,mixed_extent_page_count*8/1024 [MEPC (MB)] from sys.dm_db_file_space_usage; -- Check space usage on WideWorldImporters use WideWorldImporters go select db_name(database_id) [Database_name] ,file_name(file_id) [File_name] ,filegroup_id ,total_page_count [TPC] ,total_page_count*8/1024 [TSU (MB)] ,allocated_extent_page_count [AEPC] ,allocated_extent_page_count*8/1024 [AEPC (MB)] ,version_store_reserved_page_count [VSRP] ,version_store_reserved_page_count*8/1024 [VSRP (MB)] ,user_object_reserved_page_count [UORP] ,user_object_reserved_page_count*8/1024 [UORPC (MB)] ,internal_object_reserved_page_count [IORPC] ,internal_object_reserved_page_count*8/1024 [UORPC (MB)] ,mixed_extent_page_count [MEPC] ,mixed_extent_page_count*8/1024 [MEPC (MB)] from sys.dm_db_file_space_usage;
図2sys.dm_file_space_usage(WideWorldImporters)でのクエリの出力
total_page_count列には、問題のデータベースファイルの正確なサイズが表示されることに注意してください。また、LOGおよびFILESTREAMファイルタイプは表示されません。また、予想どおり、 alllocated_extent_page_count WWI_UserDataデータファイルの使用済みスペースと一致します。
図3WideWorldImportersデータベースのファイルサイズ
sys.dm_db_session_space_usage
表2に、sys.dm_db_session_space_usageDMVの使用法を示します。リスト2はクエリの出力です。返される行数は、インスタンス内の現在のセッション数(アクティブまたは非アクティブ)と一致することに注意してください。また、このDMVはTempDBにのみ関係することを思い出してください。
[テーブルID=45 /]
表2: sys.dm_db_session_space_usageの説明
-- Listing 2: Check space allocation per session in the instance -- Applies on to tempdb database select session_id ,db_name(database_id) [Database_name] ,user_objects_alloc_page_count [UOAPC] ,user_objects_alloc_page_count*8/1024 [UOAPC (MB)] ,user_objects_dealloc_page_count [UODPC] ,user_objects_dealloc_page_count*8/1024 [UODPC (MB)] ,internal_objects_alloc_page_count [UOAPC] ,internal_objects_alloc_page_count*8/1024 [UOAPC (MB)] ,internal_objects_dealloc_page_count [UODPC] ,internal_objects_dealloc_page_count*8/1024 [UODPC (MB)] from sys.dm_db_session_space_usage; select count(*) from sys.dm_exec_sessions;
sys.dm_db_task_space_usage
表3は、sys.dm_db_task_space_usageDMVの実装を示しています。リスト3はその出力を示しています。
[テーブルID=46 /]
表3: sys.dm_db_task_space_usageの説明
-- List 3: Check space allocation per task int the instance -- Applies on to tempdb database select task_address ,is_remote_task ,session_id ,request_id ,exec_context_id ,db_name(database_id) [Database_name] ,user_objects_alloc_page_count [UOAPC] ,user_objects_alloc_page_count*8/1024 [UOAPC (MB)] ,user_objects_dealloc_page_count [UODPC] ,user_objects_dealloc_page_count*8/1024 [UODPC (MB)] ,internal_objects_alloc_page_count [UOAPC] ,internal_objects_alloc_page_count*8/1024 [UOAPC (MB)] ,internal_objects_dealloc_page_count [UODPC] ,internal_objects_dealloc_page_count*8/1024 [UODPC (MB)] from sys.dm_db_task_space_usage;
MSSQLTempDBの他のDMVクエリ
他の2つのDMVは、データベースアクティビティが実行される前は空のようです。表4と表5に、両方の表の説明を示します。次のセクションでは、データベースアクティビティを生成するときにDMV内のデータがどのように変化するかを見ていきます。
[テーブルID=47 /]
表4: sys.dm_tran_active_snapshot_database_transactionsの説明
[テーブルID=48 /]
表5: sys.dm_tran_version_storeの説明
データベースアクティビティの完了後のDMVの調査
アクティビティを生成しましょう。
これを行うには、リスト4の簡単なクエリを実行します。
-- Listing 4 -- Query 1 use WideWorldImporters go select * from [Sales].[Invoices]; -- Query 2 use WideWorldImporters go select * from [Sales].[Invoices] order by ContactPersonID;
ご覧のとおり、この小さなクエリからの重要な割り当てや割り当て解除はないため、リスト5のスクリプトを使用して一時テーブルを作成することで基準を引き上げます。
-- Listing 5 use WideWorldImporters go select * into [#Invoices] from [Sales].[Invoices]; use tempdb go drop table [#Invoices];
これで、アクティブなセッション62に割り当てられ、予約されたかなりの数のページが取得されます(図8を参照)。また、sys.dm_db_file_space_usageに示されている多数の割り当てられたエクステントと予約済みページにも注意してください(図9)。
先に進んでTemptable#Invoiceをドロップすると、図12に示すように、TempDBに割り当てられたページが解放されていることがわかります。ただし、dm_db_session_space_usage DMVの出力は、一部のページがセッションに割り当てられていることを示しています。セッション(セッションID 62)を閉じるとすぐに、これが解放されることがわかります。
次に、別のセッションを開き、リスト6のクエリを使用してインデックスを作成します。SORT_IN_TEMPDBオプションを除くクエリ1とクエリ2では、インデックスを削除した後にこのオプションを使用します。最初のケースでは重要な割り当ては発生しませんが、SORT_IN_TEMPDBの使用中にいくつかの変更が見られます。問題のインデックスのサイズを考えると、この変化はごくわずかです(図16および17を参照)。
最終テストを行います。この時点まで、sys.dm_tran_active_snapshot_database_transactionsやsys.dm_tran_version_storeなどのDMVは、クエリ時に行を返さないことがわかりました。
SNAPSHOT_ISOLATIONおよびREAD_COMMITTED_SNAPSHOT分離レベルを有効にしましょう(リスト7)。完了すると、1つの更新ステートメントでsys.dm_tran_version_storeDMVにレコードが作成されます。これと同じクエリを配置することは、トランザクション中にsys.dm_tran_active_snapshot_database_transactionsにもレコードが生成されることを確認するために使用するトランザクションです。
-- Listing 7 ALTER DATABASE WideWorldImporters SET ALLOW_SNAPSHOT_ISOLATION ON; ALTER DATABASE WideWorldImporters SET READ_COMMITTED_SNAPSHOT ON;
-- Listing 8 -- Query 1 update [WideWorldImporters].[Sales].[Invoices] set DeliveryInstructions='Shop 50, 1476 Poddar Lane' where InvoiceID=48; -- Query 2 -- Transaction BEGIN TRAN update [WideWorldImporters].[Sales].[Invoices] set DeliveryInstructions='Shop 50, 1476 Poddar Lane' where InvoiceID=48; WAITFOR DELAY '00:00:30'; COMMIT TRAN; GO
結論
SQLServerによって公開された5つの主要なDMVを使用してTempDBアクティビティを監視できることを簡単に説明しました。このレベルの監視プロセスを実稼働環境で使用する場合、TempDBおよびデータファイルにさらに多くのスペースが必要かどうかを判断できます。また、以前にこの機能を有効にしたことがある場合は、SNAPSHOT分離の影響を分析できます。
これらのDMVの出力データは、アプリケーション開発者がtempDBおよびインスタンス全体に対するコード動作の影響を明確に示すのにも役立ちます。全体として、パフォーマンスとスペース管理に関係するDBAとしてこれらのDMVを使用することを理解することは非常にやりがいがあります。
参照
SQLServerでのスナップショットアイソレーション
複数のアクティブな結果セットの使用
sys.dm_tran_version_storeの説明
sys.dm_db_task_space_usageの説明
sys.dm_file_space_usageの説明
sys.dm_db_session_space_usageの説明
sys.dm_tran_active_snapshot_database_transactionsの説明