Oracleテンポラリ・テーブルとSQL Serverテンポラリ・テーブルの相違点の比較

7114 ワード

Oracleデータベースでテンポラリ・テーブルを作成する手順と、SQL Serverテンポラリ・テーブルとの相違点を比較する方法について説明します.ここでは、主に説明する内容について説明します.次に、この部分について説明しましょう.
1.概要
Oracleデータベースでは、永続テーブルの保存に加えて、テンポラリ・テーブルtemporary tablesを作成できます.これらのテンポラリ・テーブルは、セッションSESSIONのデータを保存するか、トランザクションに必要なデータを保存するために使用されます.セッションが終了するか、ユーザーがcommitトランザクションとロールバックrollbackトランザクションをコミットすると、テンポラリ・テーブルのデータは自動的に空になりますが、テンポラリ・テーブルの構造およびメタデータはユーザーのデータ・ディクショナリに格納されます.
2.詳細
Oracleテンポラリ・テーブルには、セッション・レベルのテンポラリ・テーブルとトランザクション・レベルのテンポラリ・テーブルがあります.
セッション・レベルのテンポラリ・テーブルとは、テンポラリ・テーブルのデータがセッションのライフサイクル中にのみ存在し、ユーザーがセッションを終了すると、Oracleはテンポラリ・テーブルのデータを自動的に消去します.
トランザクション・レベルのテンポラリ・テーブルとは、テンポラリ・テーブルのデータがトランザクション・ライフサイクルにのみ存在することを意味します.トランザクションが終了すると、Oracleはテンポラリ・テーブルのデータを自動的に消去します.
テンポラリ・テーブルのデータは、現在のセッションにのみ有効であり、各セッションには独自のテンポラリ・データがあり、他のセッションのテンポラリ・テーブルのデータにアクセスできません.したがって、テンポラリ・テーブルはDMLロックを必要としない.
Oracleは、セッションが終了する(ユーザが正常に終了する、ユーザが正常に終了しない、ORACLEインスタンスがクラッシュする)か、トランザクションが終了すると、そのセッションのテーブルに対してTRUNCATE文を実行して一時テーブルデータを空にします.他のセッションのテンポラリ・テーブルのデータは空になりません.
テンポラリ・テーブルをインデックスし、テンポラリ・テーブルに基づいてビューを作成できます.同様に、テンポラリ・テーブルに作成するインデックスも一時的であり、現在のセッションまたはトランザクションにのみ有効である.テンポラリ・テーブルはトリガを持つことができる.
3.テンポラリ・テーブルの作成
テンポラリ・テーブルの定義はすべてのセッションSESSIONに対して可視であるが、テーブルのデータは現在のセッションまたはトランザクションに対してのみ有効である.
作成方法:

1) ON COMMIT DELETE ROWS               . 
CREATE GLOBAL TEMPORARY TABLE admin_work_area 
(startdate DATE, 
enddate DATE, 
class CHAR(20)) 
ON COMMIT DELETE ROWS; 
EXAMPLE: 
SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area 
2 (startdate DATE, 
3 enddate DATE, 
4 class CHAR(20)) 
5 ON COMMIT DELETE ROWS; 
SQL> create table permernate( a number); 
SQL> insert into admin_work_area values(sysdate,sysdate,'temperary table'); 
SQL> insert into permernate values(1); 
SQL> commit; 
SQL> select * from admin_work_area; 
SQL> select * from permernate; 
A 
1 
2)ON COMMIT PRESERVE ROWS               . 
CREATE GLOBAL TEMPORARY TABLE admin_work_area 
(startdate DATE, 
enddate DATE, 
class CHAR(20)) 
ON COMMIT PRESERVE ROWS; 
EXAMPLE: 

セッション1:

SQL> drop table admin_work_area; 
SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area 
2 (startdate DATE, 
3 enddate DATE, 
4 class CHAR(20)) 
5 ON COMMIT PRESERVE ROWS; 
SQL> insert into permernate values(2); 
SQL> insert into admin_work_area values(sysdate,sysdate,'session temperary'); 
SQL> commit; 
SQL> select * from permernate; 
A 
---------- 
1 
2 
SQL> select * from admin_work_area; 
STARTDATE ENDDATE CLASS 
---------- ---------- -------------------- 
17-1?? -03 17-1?? -03 session temperary 

セッション2:

SQL> select * from permernate; 
A 
---------- 
1 
2 
SQL> select * from admin_work_area; 
    . 

セッション2セッション1のテンポラリ・テーブルのデータが表示されません.
4.Oracleテンポラリ・テーブルとSQL Serverテンポラリ・テーブルの違い
SQL Serverは、テンポラリ・テーブルを作成することもできます.テンポラリ・テーブルは永続テーブルと似ていますが、テンポラリ・テーブルはtempdbに格納され、使用されなくなると自動的に削除されます.
ローカルとグローバルの2種類のテンポラリ・テーブルがあり、名前、可視性、可用性が異なります.ローカルテンポラリ・テーブルの名前は、単一の数値記号(#)で始まります.現在のユーザー接続のみが表示されます.MicrosoftSQL Serverインスタンスからユーザーが切断されたときに削除されます.グローバル・テンポラリ・テーブルの名前は数学記号(##)で始まり、作成後はどのユーザーにも表示され、テーブルを参照しているすべてのユーザーがSQL Serverから接続を切断したときに削除されます.
SQL文CREATE TABLE文でtable_を使用nameで指定した名前はテンポラリ・テーブルを参照します.

CREATE TABLE #MyTempTable (cola INT PRIMARY KEY) 
INSERT INTO #MyTempTable VALUES (1) 

ローカル・テンポラリ・テーブルがストレージ・プロシージャによって作成された場合、または複数のユーザーによって同時に実行されたアプリケーションによって作成された場合、SQL Serverは異なるユーザーによって作成されたテーブルを区別できる必要があります.このため、SQL Serverは、ローカル・テンポラリ・テーブルのテーブル名ごとに内部的に数値接尾辞を追加します.tempdbデータベースのsysobjectsテーブルに格納されているテンポラリ・テーブルで、CREATE TABLE文で指定されたテーブル名とシステムで生成されたデジタル接尾辞で構成されています.接尾辞の追加を許可するために、ローカルテンポラリ・テーブルに指定したテーブル名table_nameは116文字を超えてはいけません.
DROP TABLE文を使用してテンポラリ・テーブルを明示的に除去しない限り、テンポラリ・テーブルは、その役割ドメインを終了するときにシステムによって自動的に除去されます.
ストレージ・プロシージャが完了すると、ストレージ・プロシージャで作成されたローカル・テンポラリ・テーブルが自動的に除去されます.テーブルを作成するストアド・プロシージャによって実行されるネストされたストアド・プロシージャはすべてこのテーブルを参照できます.しかし、このテーブルを作成するストレージ・プロシージャを呼び出すプロセスは、このテーブルを参照できません.
他のすべてのローカル・テンポラリ・テーブルは、現在のセッションの終了時に自動的に除去されます.
グローバル・テンポラリ・テーブルは、このテーブルを作成するセッションが終了し、他のタスクが参照を停止したときに自動的に除去されます.タスクとテーブルの関連付けは、単一Transact-SQL文の生存期間内にのみ保持されます.すなわち、グローバルテンポラリ・テーブルの作成セッションが終了すると、最後のテーブルを参照するTransact-SQL文が完了すると、このテーブルは自動的に除去されます.
たとえば、employeesという名前のテーブルを作成すると、削除されない限り、データベースにテーブルを使用するセキュリティ権限がある限り、誰でもこのテーブルを使用できます.#employeesというローカル・テンポラリ・テーブルを作成した場合、テーブルに対して操作を実行し、接続を切断したときにテーブルを削除できるのは、テーブルのみです.###employeesという名前のグローバル・テンポラリ・テーブルを作成すると、データベース内の任意のユーザーがテーブルに対して操作を実行できます.テーブルが作成後に他のユーザーが使用しない場合は、接続を解除するとテーブルが削除されます.テーブルが作成後に他のユーザーが使用している場合、SQL Serverはすべてのユーザーが接続を切断した後にテーブルを削除します.
ストアド・プロシージャまたはトリガで作成されたローカル・テンポラリ・テーブルは、ストアド・プロシージャまたはトリガを呼び出す前に作成された同名のテンポラリ・テーブルとは異なります.クエリーがテンポラリ・テーブルを参照し、同じ名前のテンポラリ・テーブルが2つある場合、クエリーをどのテーブルに対して解析するかは定義されません.ネストされたストレージ・プロシージャは、呼び出されたストレージ・プロシージャが作成したテンポラリ・テーブルと同じ名前のテンポラリ・テーブルを作成することもできます.ネストされたストアド・プロシージャのテーブル名に対するすべての参照は、ネストされたプロシージャに対して作成されたテーブルとして解釈されます.たとえば、次のようになります.

CREATE PROCEDURE Test2 
AS 
CREATE TABLE #t(x INT PRIMARY KEY) 
INSERT INTO #t VALUES (2) 
SELECT Test2Col = x FROM #t 
GO 
CREATE PROCEDURE Test1 
AS 
CREATE TABLE #t(x INT PRIMARY KEY) 
INSERT INTO #t VALUES (1) 
SELECT Test1Col = x FROM #t 
EXEC Test2 
GO 
CREATE TABLE #t(x INT PRIMARY KEY) 
INSERT INTO #t VALUES (99) 
GO 
EXEC Test1 
GO 

次は結果セットです.

(1 row(s) affected) 
Test1Col  
-----------  
1  
(1 row(s) affected) 
Test2Col  
-----------  
2 

ローカルまたはグローバルテンポラリ・テーブルを作成するとき、CREATE TABLE構文は、FOREGN KEY制約以外のすべての制約定義をサポートします.テンポラリ・テーブルでFOREGN KEY制約を指定すると、文は、この制約が無視されていることを示す警告メッセージを返します.テーブルは作成されますが、FOREGN KEY制約はありません.FOREGN KEY制約ではテンポラリ・テーブルは参照できません.
テンポラリ・テーブルではなく、テーブル変数の使用を検討します.テンポラリ・テーブルにインデックスを明示的に作成する必要がある場合、または複数のストレージ・プロシージャまたは関数がテーブル値を使用する必要がある場合、テンポラリ・テーブルは便利です.通常、テーブル変数はより効率的なクエリー処理を提供します.
Oracleとの相違点:
1.SQL Serverテンポラリ・テーブルは「メモリ・テーブル」であり、テーブルはメモリに格納される.ORACLEテンポラリ・テーブルDROP TABLEを実行しない限り、テーブル定義はデータ辞書に保持されます.
2.SQL Serverテンポラリ・テーブルには、ORACLEテンポラリ・テーブルのようなトランザクション・レベルの機能はありません.
3.SQL Serverローカルテンポラリ・テーブル(#)は、ORACLEのセッション・レベルテンポラリ・テーブルと似ていますが、セッションが終了した場合、ORACLEはテーブルを削除しません.
4.SQL Serverのグローバルテンポラリテーブル(##)とは、複数の接続が同一メモリを共有することを意味する.メモリ領域を参照するポインタがない場合、SQL Serverは自動的にグローバル・テンポラリ・テーブルを解放します.
5.Oracleはメモリ内のデータベースではないためです.したがって、OracleがSQL Serverのように頻繁にテンポラリ・テーブルを作成および削除する場合、パフォーマンスに影響を与えることは間違いありません.したがって、OracleはユーザーDROP TABLEまでテンポラリ・テーブルの定義を保持します.
6.Oracleで、複数のユーザーが1つのテーブルを共有する必要がある場合(SQL Serverのようなグローバル・テンポラリ・テーブル##).永続的なテーブルを使用することができ、ユーザを一意に識別できるカラムをテーブルに追加することができる.トリガとビューを利用する.ユーザが終了すると、そのログインユーザの一意の情報に基づいて対応するテーブルのデータが削除される.この方法はOracleに一定の負荷をもたらします.
Oracleテンポラリ・テーブルとSQL Serverテンポラリ・テーブルの相違点の比較に関する知識をここに紹介します.