oracleノート整理10——性能調整の臨時表と物化ビュー


1.テンポラリ・テーブル
1)概念
a)テンポラリ・テーブルと永続テーブルの最大の違いは、テーブル内のデータが永遠に存在しないことである
b)Oracleテンポラリ・テーブルは、セッション・レベルのテンポラリ・テーブルとトランザクション・レベルのテンポラリ・テーブルに分けられます.
c)セッションテンポラリテーブル、セッション終了または中断時にデータを空にする.
create global temporary table XXX() on commit preserve rows;

d)トランザクションテンポラリテーブル、commit後にデータを空にする.
on commit delete rows;

2)原理
a)テンポラリ・テーブルはそれらのブロックに対してredoを生成しない.したがって、テンポラリ・テーブルの操作は「リカバリ可能」ではありません.テンポラリ・テーブルのブロックを変更すると、この変更はREDOログ・ファイルに記録されません.ただし、テンポラリ・テーブルは確かにundoを生成し、このundoはログに会計されます.したがって、テンポラリ・テーブルにもいくつかのredoが生成されます.
b)これはあなたが事務の中のSAVEPOINTにロールバックできるからです.undoデータはログを確立する必要があるため、テンポラリ・テーブルは生成したundoのREDOログを生成します.これはひどいようです.ただし、テンポラリ・テーブル上で実行されるSQL文は主にINSERTとSELECTである.幸いなことに、INSERTはごくわずかなundoのみを生成し(ブロックを挿入前の「なし」状態に戻す必要があり、「なし」を格納するにはあまり空間が必要ない)、またSELECTはundoを生成しない.
c)Oracleのテンポラリ・テーブルはまた、マルチユーザー操作の独立性を保証します.同じテンポラリ・テーブルを使用する異なるユーザーに対して、ORACLEは独立したTemp Segmentを割り当てます.これにより、複数のユーザーが同じテンポラリ・テーブル操作時に交差することを回避し、複数のユーザー操作の同時性と独立性を保証します.
3)最適化の適用
a)複数のテーブルが関連付けられ、小さなテーブルが存在する場合.大きなテーブルを関連付けて比較的小さい結果セットをテンポラリ・テーブルに格納し、テンポラリ・テーブルで小さなテーブルを関連付けることができます.
b)あるデータセットがこのセッション中に複数回使用する必要がある場合は、テンポラリ・テーブルを使用することを推奨します.
2.物体化ビュー
1)概念
ビューは、作成時に指定したクエリー・ステートメントに基づいて返される仮想テーブル(文とみなすこともできます)です.アクセスするたびに、クエリー・ステートメントが1回実行されます.アクセスするたびにクエリーが実行されないように、このクエリー・結果セットをマテリアライズド・ビュー(マテリアライズド・ビューとも呼ばれます)に格納できます.
2)タイプ
物化ビューのタイプ:ON DEMAND、ON COMMIT
a)on demand必要に応じて(ON DEMAND):マテリアライズド・ビューは明示的に要求された場合にリフレッシュされます(手動で呼び出すことも、指定された時間間隔でタスクを実行することもできます).これは、ベース・テーブルの変更からマテリアライズド・ビューのリフレッシュまでの間、マテリアライズド・ビューに失効したデータが含まれる可能性があることを意味します.
b)on commit提出時(ON COMMIT):マテリアライズド・ビューは、ベース・テーブルの変更がある同じトランザクションで自動的にリフレッシュされます.つまり、マテリアライズド・ビューには常に最新のデータが含まれています.(この方式は比較的少ない)
3)更新
a)完全リフレッシュ(COMPLETE)は、テーブル内のすべてのレコードを削除し(単一テーブルリフレッシュの場合、TRUNCATE方式を採用する可能性があります)、次に、マテリアライズド・ビューのクエリ文の定義に基づいてマテリアライズド・ビューを再生成します.
b)クイックリフレッシュ(FAST)はインクリメンタルリフレッシュのメカニズムを採用し、前回リフレッシュ後にベーステーブルに対して行ったすべての操作を物化ビューにリフレッシュするだけである.
c)FORCE方式これはデフォルトのデータリフレッシュ方式である.Oracleでは、クイック・リフレッシュの条件が満たされているかどうかを自動的に判断し、満たされている場合はクイック・リフレッシュを行い、そうでない場合はフル・リフレッシュを行います.
4)文法
create materialized view view_name refresh [fast|complete|force] [ on [commit|demand] | start with (start_time) next (next_time) ] AS subquery;

5)例
a)MATERIALIZED VIEWの作成:
create materialized view mv_materialized_test refresh force on demand start with sysdate next to_date(concat(to_char(sysdate+1,'dd-mm-yyyy'),'10:25:00'),'dd-mm-yyyy hh24:mi:ss') as select * from user_info; 
--         10:25     

b)更新時間を変更する:
alter materialized view mv_materialized_test refresh force on demand start with sysdate next to_date(concat(to_char(sysdate+1,'dd-mm-yyyy'),' 23:00:00'),'dd-mm-yyyy hh24:mi:ss');
 
alter materialized view mv_materialized_test refresh force on demand start with sysdate next trunc(sysdate,'dd')+1+1/24; --   1