私は一時テーブルのため、このような命名規則を使用していないSQL Server:#ABCDEF01という名前のテーブルには何が含まれていますか?
など、要求
select *
from tempdb.sys.objects
where type_desc = 'USER_TABLE'
を実行し、#AB12CD34
のような名前の表を参照してください、#ABCDEF01
。これらのテーブルの実際の名前を決定することは可能ですか?
私は一時テーブルのため、このような命名規則を使用していないSQL Server:#ABCDEF01という名前のテーブルには何が含まれていますか?
など、要求
select *
from tempdb.sys.objects
where type_desc = 'USER_TABLE'
を実行し、#AB12CD34
のような名前の表を参照してください、#ABCDEF01
。これらのテーブルの実際の名前を決定することは可能ですか?
これは、標準の一時テーブルのシステム命名規則ではありません。
一時表は、一般的に最後の六角は異なるセッション間の衝突を防ぐように作用する形式
#YourTempTableName______________ ... _________00000000000D
で128文字の名前として表示されます。 #AB12CD34
という名前
の表は、どちらかのテーブル変数/テーブル値パラメータであるか、またはストアド・プロシージャからの一時テーブルをキャッシュされます。それは次回の使用に再び再作成する必要はありませんので、
ストアドプロシージャが一時テーブルの実行を終了キャッシュすることができます。 FCheckAndCleanupCachedTempTable
トランザクションは、テンポラリテーブルの名前をas part of this processの形式に変更します。
More about temporary table caching in this blog post。
キャッシュされた一時テーブルは、キャッシュされた実行計画の実行コンテキストに属します。あなたはまた、
select *
from sys.dm_os_memory_cache_entries
where name='tempdb' AND entry_data LIKE '<entry database_id=''2'' entity_type=''object'' entity_id=''-%'
でキャッシュされた一時テーブルを参照することができ
SELECT DB_NAME(dbid) AS DatabaseName,
OBJECT_NAME(objectid, dbid) AS ObjectName
FROM sys.dm_exec_cached_plans cp
CROSS apply sys.dm_exec_sql_text(cp.plan_handle) t
JOIN sys.dm_os_memory_objects m1
ON m1.memory_object_address = cp.memory_object_address
JOIN sys.dm_os_memory_objects m2
ON m1.page_allocator_address = m2.page_allocator_address
WHERE m2.type = 'MEMOBJ_EXECUTE'
AND cp.objtype = 'Proc'
でキャッシュされた実行コンテキストでストアドプロシージャを見ることができますしかし、私は一緒に計画は何をキャッシュするかを確認するためにこれらのリンクのいずれかの方法が表示されません一時オブジェクト。
あなたは、列名を見て、あなたがprocsのの1からテーブル構造を認識した場合に見ることができました。
WITH T
AS (SELECT *
FROM tempdb.sys.objects
WHERE type_desc = 'USER_TABLE'
AND name = '#' + CONVERT(VARCHAR, CAST(object_id AS BINARY(4)), 2))
SELECT T.name,
c.name,
type_name(c.user_type_id) AS Type
FROM T
JOIN tempdb.sys.columns c
ON c.object_id = T.object_id;
Martin、最後のスクリプトは間違いなく私が必要とするものです。単一の不明なアイテムが残っています:これらのキャッシュされたオブジェクトは、テーブル構造のみ、または構造とデータを保持しますか?これらのキャッシュ上にたくさんのディスクスペースを確保したり、セキュリティ上の問題が発生する可能性はありますか? – Oxoron
テーブル構造と1つの8K IAMページと8Kデータページに関するメタデータを保持するだけで、競合が発生してもこれらを再度割り振り解除する必要がなくなります。したがって、tempdb領域に関して重要なものを追加することはまずありません。特にセキュリティ上の問題はありません。 1つのセッションは別の以前のセッションの内容を見ることができません。 –
「#」で始まる任意のテーブルは、セッションまたは接続が失われるまで存在する一時的なテーブルです。テーブルは、現在のセッション内でのみ表示されます。 '##'で始まる表は、本質的にグローバルであり、他のセッション/接続がそれを見ることができるという点を除いて、同様のタイプの表です。
ランディ、これらのテーブルの一部は3日前に作成されます。どのセッション\接続を作成したかを定義することは可能ですか? Principal_idがnullです。 – Oxoron
質問に表示される命名規則は、標準の一時表のシステム表で使用される命名規則ではありません。これは、表変数またはストアド・プロシージャーのキャッシュされた一時表のいずれかです。 –
の可能性のある重複した[は、SQLサーバーに一時テーブルを作成するための#を使用することが必要ですか?](http://stackoverflow.com/questions/16749045/is-it-necessary-to-use-for- create-temp-tables-in-sql-server) – Igor
@Igor複製ではありません。あなたがオリジナルとして提案した質問は、テンポラリテーブルに名前を付ける方法です。私の考えは、存在するテーブルの名前を復元する方法です。 – Oxoron
私はこれらの言及テーブルが私の一時的なデータベースを発見していない。私はこれらが一時テーブルであることに同意し、セッション/接続が閉じられると自動的に削除されます。 –