web-dev-qa-db-ja.com

Oracleの一時テーブルとグローバル一時テーブルの違いは何ですか?

この2つの用語「テンポラリーテーブル」と「グローバルテンポラリーテーブル」は、似たような文脈でよく使われると聞きました。

2つの違いは何ですか?

29
MOZILLA

Oracleでは違いはありません。 Oracleデータベースに一時テーブルを作成すると、それは自動的にグローバルになり、「グローバル」キーワードを含める必要があります。

「GLOBAL TEMPORARY TABLE」という用語の解釈方法を定義するSQL標準では、LOCALまたはGLOBALスコープを使用できます。これにより、ユーザー固有のテーブル(LOCAL)または全員(GLOBAL)が可能になります。 OracleはGLOBALバージョンのみを実装します。

Oracle一時テーブルに入れるデータは、セッションに固有です。つまり、同じテーブルを使用している100人のユーザーがいても、データを表示できるのは自分だけであり、テーブルの設定に応じて、切断するとき(または現在のトランザクションをコミットするとき)にデータがテーブルから削除されます。

これを、一時テーブルがローカルであるMS SQL-Serverと比較してください。作成した場合、一時テーブルが存在することは誰にもわかりません。 Oracleでは、一時テーブルを作成すると、誰でも(スキーマにアクセスできるすべての人)がテーブルを表示できます。セッションからログアウトすると、SQL-Serverテーブルが削除され、次のセッションのために再作成する必要があります。 Oracleでは、データがそうでない場合でも、一時テーブルはスキーマの永続的な部分になりました。

54

これを、一時テーブルがローカルであるMS SQL-Serverと比較してください。作成した場合、一時テーブルが存在することは誰にもわかりません。 Oracleでは、一時テーブルを作成すると、誰でも(スキーマにアクセスできるすべての人)がテーブルを表示できます。セッションからログアウトすると、SQL-Serverテーブルが削除され、次のセッションのために再作成する必要があります。 Oracleでは、データがそうでない場合でも、一時テーブルはスキーマの永続的な部分になりました(そうでない場合は、データを保持するかどうかを決定できます)。 Oracleはグローバル一時テーブルのみをサポートしているため、セッションごとにテーブルを作成する必要がありません。 「存在」しますが、空であり、その内容はセッションごとに一意(およびプライベート)です。

7
Joby Thomas

グローバル一時テーブルには統計が関連付けられていないことに注意してください。そのため、インスタンスの動的サンプリングレベルを設定して、解析されていないテーブルが解析時にサンプリングされるようにする必要があるかどうかを調べます。そうしないと、ヒューリスティックが厄介な実行計画につながる可能性があります。

6
David Aldridge

ローカルとグローバルの一時テーブルに関する既存の回答に追加するために、Oracle 18cからは完全に 「プライベート一時テーブル」 があります。

プライベート一時テーブルは、トランザクションまたはセッションの終了時に自動的に削除される一時データベースオブジェクトです。プライベート一時テーブルはメモリに格納され、表示されますそれを作成したセッションにのみ。

プライベートテンポラリテーブルは、テンポラリテーブルのスコープをセッションまたはトランザクションに限定するため、アプリケーションコーディングの柔軟性が高まり、コードのメンテナンスが容易になり、すぐに使用できる機能が向上します。

Oracle Live SQLからのデモ:18cプライベート一時テーブル

-- Private temporary tables must be prefixed as per the database parameter 
-- 'private_temp_table_prefix' 

create private temporary table ORA$PTT_MY_TT ( x int );

-- The table is truly private. 
-- It does not even exist in the the data dictionary, only your session 

-- By default, the moment you commit, the table ceases to exist 
commit;

select * from ORA$PTT_MY_TT;
-- ORA-00942: table or view does not exist

-- This can be changed by specifying that the definition should be preserved 
create private temporary table ORA$PTT_MY_TT ( x int )  
on commit preserve definition;

insert into ORA$PTT_MY_TT  
select rownum from dual  
connect by level <= 30;

commit;

select count(*) from ORA$PTT_MY_TT;
-- 30 

db <> fiddle demo

3
Lukasz Szozda

さらに、Oracle(グローバル)一時テーブルは、各ユーザー/セッションがそれぞれ異なるデータセットを参照する必要がある場合にveryが役立ちます。レコードをグローバル一時テーブルに挿入するだけで、クリーンアップだけでなく、あるユーザーのセットと別のユーザーのセットの維持をOracleに管理させることができます。ユーザーのID、セッションIDなどでクエリを実行する必要はありません。

とても便利です。

2
Stew S

一時テーブルはなく、グローバル一時テーブルのみです。グローバル一時テーブルの考え方は、定義が存在し、すべての人が見ることができるということですが、データはセッションごとにプライベートです。コミット時にデータをクリーンアップするか、セッションが終了したときにのみクリーンアップするかを構成することもできます。

0
Nisar