8

tempdb の競合を減らすために T-SQL ストアド プロシージャの一部を最適化しようとしていますが、テーブル以外の変数が SQL サーバーによってどのように格納されているかわかりません。

  • INT や DATETIME のような単純なデータ型はどうですか? 彼らは記憶の中で生きているように感じます。
  • VARCHARs/VARCHAR(MAX) はどうですか? 通常の VARCHAR はメモリ内に存在できますが、VARCHAR(MAX) はストレージに tempdb を使用する必要がある場合があります。
  • テーブル変数は tempdb に格納されます。これらは私はあまり興味がありません。

tempdb に関する MSDN の記事では、通常の変数について説明していません。

4

2 に答える 2

11

tempdbのキャパシティプランニングの記事はあなたの質問に答えます:

ラージオブジェクトのデータ型は、varchar(max)、nvarchar(max)、varbinary(max)text、ntext、image、およびxmlです。これらのタイプのサイズは最大2GBであり、ストアドプロシージャ、ユーザー定義関数、バッチ、またはクエリで変数またはパラメーターとして使用できます。LOBデータ型として定義されているパラメーターと変数は、値が小さい場合、ストレージとしてメインメモリを使用します。ただし、大きな値はtempdbに保存されます。LOB変数とパラメーターがtempdbに格納される場合、それらは内部オブジェクトとして扱われます。sys.dm_db_session_space_usage動的管理ビューにクエリを実行して、特定のセッションの内部オブジェクトに割り当てられたページをレポートできます。

この記事は、tempdbの他の多くの使用法もカバーしているため、全体を読む価値があります。

編集:特定のセッションが使用しているtempdbのメモリ量に興味がある場合は、次のクエリを実行できます。

select * 
from sys.dm_db_session_space_usage 
where session_id = @@SPID

これを使用すると、変数のサイズが約1000 KBに達するまで、変数がtempdbに格納されているようには見えませんでしたVARCHAR(MAX)...しかし、サーバーが使用可能なメモリによって異なると確信しています。

于 2012-03-15T22:07:52.550 に答える