Oracle臨時表とSQL Server臨時表の違いを比較します。


Oracleデータベース作成仮テーブルのプロセスとSQL Server臨時テーブルとの違いについての比較に関する知識は本論文で紹介したい内容です。この部分をご紹介しましょう。ご協力をお願いします。
1.概要
Oracleデータベースは永久テーブルを保存するほか、臨時テーブルtemporaryテーブルを作成することができます。これらの一時テーブルは、セッションSESSIONのデータを保存するために使用されるか、またはトランザクションに必要なデータを保存するために使用される。セッションが終了するか、またはユーザがcomitおよびロールバックロックトランザクションを提出すると、一時テーブルのデータは自動的に空になるが、一時テーブルの構造およびメタデータはまたユーザのデータ辞書に記憶される。
2.詳しく紹介する
Oracle臨時表は会話レベル臨時表と事務レベル臨時表に分けられます。
セッションレベル一時テーブルとは、一時テーブル中のデータがセッションライフサイクル中にのみ存在し、ユーザがセッション終了時にOracleが自動的に一時テーブル中のデータを消去することを意味する。
事務レベル臨時表とは、臨時表のデータが事務ライフサイクルにのみ存在することを意味します。一つの業務が終わったら、Oracleは自動的に臨時表のデータを消去します。
臨時テーブルのデータは現在のSessionにのみ有効で、各Sessionには自分の臨時データがあり、他のセッションの臨時テーブルのデータにはアクセスできません。したがって、臨時表は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に記憶されています。使用しないと自動的に削除されます。
ローカルとグローバルの両方のタイプの一時テーブルがあります。両方は名前、可視性、利用可能性が異なります。当地臨時表の名称は単一の数字記号で始まる。これらは現在のユーザ接続だけで見られます。ユーザーがMicrosoft SQL Serverのインスタンスから接続を切断したときに削除されます。グローバル臨時表の名前は数学記号で始まり、作成後はどのユーザーに対しても分かります。この表を参照しているすべてのユーザーはSQL Serverから接続を切断した時に削除されます。
SQL文ではCREATE TABLE文でテーブル_nameで指定された名前は、一時表を参照します。

CREATE TABLE #MyTempTable (cola INT PRIMARY KEY) 
INSERT INTO #MyTempTable VALUES (1) 
ローカル一時テーブルが記憶プロセスによって作成されたり、複数のユーザによって同時に実行されたりするアプリケーションによって作成された場合、SQL Serverは、異なるユーザによって作成されたテーブルを区別することができる必要がある。このため、SQL Serverは、内部にローカル臨時テーブルごとのテーブル名にデジタルのサフィックスを追加します。tempdbデータベースのsyssobjectテーブルに格納されている一時テーブルのフルネームは、CREATE TABLE文で指定されたテーブル名とシステムで生成されたデジタルのサフィックスからなります。拡張機能の追加を許可するために、ローカル臨時テーブルに指定されたテーブル名テーブルテーブルテーブルテーブルを指定します。nameは116文字を超えてはいけません。
DROP TABLE文で明示的に臨時表を除去しない限り、臨時表はその作用領域を終了する時にシステムによって自動的に除去されます。
格納プロセスが完了すると、格納中に作成されたローカル一時テーブルが自動的に消去されます。作成テーブルの格納プロセスによって実行されるすべてのネスト記憶プロセスは、この表を参照することができます。このテーブルを作成するための格納プロセスを呼び出すプロセスはこの表を参照することができません。
他のローカル一時テーブルはすべて現在のセッション終了時に自動的に削除されます。
グローバル一時テーブルは、このテーブルを作成したセッションが終了し、他のタスクが参照を停止したときに自動的に削除されます。タスクとテーブルの間の関連は、単一のTransact-SQL文の生存期間内にのみ保持されます。つまり、グローバル一時テーブルを作成するセッションが終了すると、この表のTransact-SQL文を最後に引用した後、自動的にこの表を削除します。
例えば、employesという名前のテーブルを作成すると、誰でもデータベースにこのテーブルを使用するセキュリティ権限がある限り、このテーブルを使用してもいいです。削除した場合を除いて。というローカル一時テーブルを作成すると、このテーブルに対して操作を実行して、接続を切断したときにのみ削除できます。というグローバル臨時表を作成すれば、データベース内のいかなるユーザーもこの表に対して操作を実行できます。作成後に他のユーザーが使用しない場合、このテーブルは接続を切断すると削除されます。作成後に他のユーザーが使用するテーブルがある場合は、SQL Serverはすべてのユーザが接続を切断してから削除します。
記憶プロセスまたはトリガーで作成されたローカル一時テーブルは、記憶プロセスまたはトリガーを呼び出す前に作成された同名の一時テーブルとは異なる。クエリーが一時テーブルを参照し、同じ名前の臨時テーブルが二つある場合、どのテーブルに対してクエリーを解析するかは定義されません。ネスト記憶プロセスは、その記憶プロセスを呼び出して作成した一時テーブルと同名の一時テーブルを作成することもできる。ネスト記憶中のテーブル名のすべての参照は、ネストプロセスに対して作成されたテーブルとして解釈されます。例えば、

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において、一つのテーブル(SQL Serverのようなグローバル一時テーブル)を複数のユーザが共有する必要があるならば、永久テーブルを利用して、ユーザーを一意に識別できる列をテーブルに追加して、フリップフロップとビューを利用して、ユーザが退出する時に、当該登録用ユーザの固有情報に基づいて該当テーブルのデータを削除することができます。この方法はOracleに一定量の負荷をもたらします。
Oracle臨時表とSQL Server臨時表の違いについて、ここに紹介しました。今回の紹介はあなたのために何か収穫がありますように。