私は2つの主要な利点を考えることができます:並行性の問題を回避永続テーブル(テーブル)の代わりに一時テーブル(#テーブル)を使用する利点は何ですか?
- 、あなたは多くのプロセス1つのプロセスは、既存のテーブルを作成しようとして、あなたがトラブルに巻き込まれることができ、テーブルをドロップ/作成を持っている場合。
- パフォーマンス、私は一時テーブル(#を使用して)を作成すると、通常のテーブルよりもパフォーマンスが良いと思います。
他に理由がありますか、私の理由が間違っていますか?
私は2つの主要な利点を考えることができます:並行性の問題を回避永続テーブル(テーブル)の代わりに一時テーブル(#テーブル)を使用する利点は何ですか?
他に理由がありますか、私の理由が間違っていますか?
あなたは一時的と永続的なテーブルを比較することはできません。
に表示されます。
2種類のテーブルの間にパフォーマンス(どちらの方法でも)の違いはほとんどありません。
いつもテーブルを削除したり作成したりするべきではありません。これに依存しているアプリケーションは、SQLコールを呼び出すだけで何か間違っています。
(1)TempテーブルはSQL Server TEMPDBデータベースで作成されるため、より多くのIOリソースとロックが必要です。テーブル変数と派生テーブルはメモリ内に作成されます。
(2)一般的に、並列表を使用して大量のデータを処理するとパフォーマンスが向上しますが、テーブル変数は少量のデータに最適です(100行以下の経験則を使用します)。パラレル化はパフォーマンスの大幅な向上をもたらさないでしょう。
(3)ストアドプロシージャを使用して、テーブル変数または派生テーブルにデータを挿入することはできません。たとえば、次のように動作します。INSERT INTO #MyTempTable EXEC dbo.GetPolicies_sp次のエラーは、INSERT INTO @MyTableVariable EXEC dbo.GetPolicies_spを生成します。
(4)派生テーブルは、SELECTステートメントからのみ作成できますが、挿入、更新、または削除ステートメント内で使用できます。
(5)スコープの耐久性の順に、テンポラリテーブルはスコープ内で最も拡張され、次にテーブル変数、最後に派生テーブルが続きます。
これは単なるインターウェブからカットアンドペーストされ、私は1)がとにかく正しいとは思わない。 – Yellowfog
申し訳ありませんが、これは私のブログ&このセント%正しいものからカット&ペーストされています。あなたは、この話題に関連していない点を理由で教えてもらえますか? –
1) テーブル変数の有効期間は、トランザクションが実行されている間のみです.DECLARE文を最初に実行した後、@tempテーブル変数にレコードを挿入しようとすると、変数は存在しなくなりました。 1つのトランザクションでレコードを宣言して@tempに挿入してから、テーブルをクエリしようとすると、結果は同じになります。あなたが気づいたら、#tempに対してDROP TABLE文を実行する必要があります。これは、セッションが終了するまで、またはテーブルが削除されるまで、テーブルが存続するためです。
2) テーブル変数には明確な制限があります。
- テーブル変数は、非クラスタ化インデックスを持つことはできません - あなたは、テーブル変数に制約を作成することはできません - あなたは、テーブル変数 -Similaritiesとに対して作成することができません - 統計テーブル変数の列にデフォルト値を作成することはできません。一時テーブルが含まれます:
類似点を一時テーブルに含まれます:tempdbの -Clusteredインデックスで
-Instantiatedは、トランザクションにログインしている - 両方のテーブル変数と一時テーブル 上で作成することができますログ - 一時表と通常表の場合と同様に、ユーザーは表変数(SELECT、INSERT、UPDATEおよびDELETE)に対してすべてのデータ変更言語 - (DML)問合せを実行できます。
私が知っていることは、永続的なテーブルの削除と作成が間違っていることに同意します。私は#テーブルが違うことを知りたかったのです。主な違いはスコープです... –
スコープとはtempdbにあります。あなたの質問は並行性とパフォーマンスを具体的に問いませんが、いずれも真ではありません – gbn
Hmmmしかし、グローバルな一時テーブルスコープを使用すると違いはありません... –