この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 11952|答える: 0

[出典] SQL Serverデータベースにおける一時テーブルの詳細な説明

[リンクをコピー]
掲載地 2020/05/28 10:52:28 | | | |
一時テーブルはSqlserverデータベースにおいて非常に重要であり、以下はSQLデータベースにおける一時テーブルの特徴と使用法についての詳細な紹介を参考にします。

一時テーブルは永続テーブルに似ていますが、一時テーブルはtempdbに保存され、使用されなくなると自動的に削除されます。 一時テーブルにはローカルテーブルとグローバルテーブルの2種類があります。 名前、知名度、入手可能性によって区別されます。

一時テーブルの特徴は以下の通りです:

  • ローカル一時テーブルとは、ユーザーがテーブルを作成する際に「#」プレフィックスを追加するテーブルで、データベース接続に応じて独立しています。 ローカルの一時テーブルを作成したデータベース接続のみがテーブルにアクセスでき、他の接続はテーブルにアクセスできません。
  • 異なるデータベース接続では、作成されるローカルの一時テーブルは同じ「名前」を持ちますが、これらのテーブル同士には関係性がありません。 SQLSERVERでは、データベース接続内のローカル一時テーブルの独立性を保証する特別な命名機構があります。
  • 真の一時テーブルは、データベースシステムによって自動的に維持されるデータベースの一時テーブルスペースを利用し、テーブル容量を節約します。 また、一時テーブル空間は一般的に仮想メモリを使用するため、ハードディスク上のI/Oの数が大幅に減少し、システムの効率も向上します。
  • トランザクションやセッション終了後、一時テーブルは自動的に空になるので、データが切れた後にデータを削除する必要がありません。


ローカル一時テーブル

ローカル一時テーブルの名前は単一の数字記号(#)で前付けされます。 これらは現在のユーザー接続(すなわちローカルの一時テーブルを作成する接続)にのみ見えます。 ユーザーがSQL Serverインスタンスから切断すると削除されます。

例えば、データベース接続内でローカルの一時テーブルを作成し、次の文を使います:#Temp

データベース接続1:



その後、同時にデータベース接続2を起動してクエリを実行し #temp

データベース接続2:



データベース接続2の結果を見てみよう。

データベース接続2:



結果は、データベース接続2がテーブル #Temp を見つけられないことを示しています。 つまり、一時テーブル #Temp は作成したデータベース接続1にのみ見え、データベース接続2には見えません。

グローバル一時テーブル

グローバル一時テーブルの名前は2つの数字記号(##)で始まり、作成された際にはすべてのデータベース接続から見え、テーブルを参照するすべてのデータベース接続がSQL Serverから切断されると削除されます。

例えば、データベース接続でグローバル一時テーブル##Temp を作成し、次の文を付けてから3行のデータを追加します

データベース接続1:



次にデータベース接続2で##Temp的数据 をクエリします

データベース接続2:



データベース接続2の結果は以下の通りです。

データベース接続2:



ご覧の通り、データベース接続2はデータベース接続1によって作成されたグローバル一時テーブル##Temp に正常にアクセスできますが、今データ接続1を閉じてからデータベース接続2の##Temp查询语句会发生什么呢 を実行するとどうでしょうか? 結果は以下の通りです。

データベース接続1を閉じると、再度データベース接続2が実行されます:



データベース接続1を閉じた後、データベース接続2はグローバル一時テーブル##Temp了 を見つけられないことを発見しました。 これは、データベース接続1が閉じた後、データベース接続2に一時テーブル##Temp を使う文が存在しないため、sqlserverはグローバル一時テーブル##Temp了 を参照するデータベース接続がないと判断し、##Temp释放掉了 を行います。


次に、データベース接続2のグローバル一時テーブル##Temp持有事务中的排他锁(Xロック)を閉じ、データベース接続1を閉じようとします。

データベース接続1:



データベース接続2:



データベース接続1を閉じると、データベース接続2は次のように実行されます:



結果は、データベース接続1を閉じても、データベース接続2がトランザクションでグローバル一時テーブル##Temp的排他锁(Xロック)を保持していたため、一時テーブル##Temp并没有随着数据库连接1的关闭而被释放掉、データベース接続2で開始されたトランザクションがロールバックまたはコミットされていない限り、データベース接続2は常に一時テーブル##Temp的排他锁 を保持することを示しています。 この時点で、Sqlserverはグローバル一時テーブル##Temp を参照するデータベース接続がまだあると判断し、##Temp不会被释放掉 となります。




先の:TypeScriptプロパティアクセサ(set, get)
次に:SQL Serverは現在のシステム時刻の前日を問い合わせます
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com