2011年8月30日火曜日

データ・ディクショナリ

当たり前すぎて、忘れてしまうので。メモ&コピー

データ・ディクショナリのすべての実表とユーザー・アクセス可能ビューは、Oracle DatabaseユーザーSYSが所有している。データ・ディクショナリの実表内のデータは、Oracle Databaseを機能させるために必要。このため、データ・ディクショナリの情報はOracle Databaseによってのみ書込みまたは変更される必要がある。したがって、Oracle Databaseのユーザーは、SYSスキーマに含まれている行またはスキーマ・オブジェクトを変更できない。変更すると、データ整合性が損われることがある。セキュリティ管理者は、このアカウントを厳しく管理する必要があり。

実表
    データベースに関する情報を格納する、基礎となる表です。これらの表に読取り/書込みできるのはOracle Databaseのみです。これらの表は正規化され、データのほとんどは、暗号形式で格納されているため、ユーザーが直接アクセスすることはほとんどありません

    ビュー

    これらのビューは、実表にあるデータを、ユーザー名や表の名前などの実用的な情報にデコードし、結合WHERE句を使用して情報を簡略化します。これらのビューには、データ・ディクショナリ内のすべてのオブジェクトの名前と説明が含まれています。すべてのユーザーがアクセスできるビューもいくつかありますが、その他のビューは管理者のみが使用するように設計されています。



      表6-1 データ・ディクショナリ・ビューのセット
      接頭辞 ユーザー・アクセス 内容 注意

      DBA_


      データベース管理者

      すべてのオブジェクト

      一部のDBA_ビューには、管理者にとって有用な情報を含む列が追加されています。

      ALL_


      すべてのユーザー

      ユーザーが権限を持つオブジェクト

      ユーザーが所有するオブジェクトが含まれています。これらのビューは有効化されている現在の一連のロールに従います。

      USER_


      すべてのユーザー

      ユーザーによって所有されているオブジェクト

      接頭辞がUSER_のビューには、通常、列OWNERは含まれません。この列は、問合せを発行するユーザーとして、USER_ビューに暗黙的に含まれています。


      2011年8月26日金曜日

      grep

      Oracleの話題ばかりなので、少し違ったTipsを。

      grepは以下の略とは本当か?
      ex editorのグローバルサーチのg
      正規表現のregular expression
      printのp



      2011年8月25日木曜日

      Call Stored Procedure② (OracleADF)

      IN引数のみのストアド・プロシージャ呼出をする為には?

      JDBC PreparedStatementオブジェクトを使用する。通常、以下の手順のヘルパーメソッドを用意し、呼出部分の簡素化を実施する。
      1. 渡される文のためのJDBC PreparedStatementを作成し、PL/SQLのbegin...endブロック内にラップする。
      2.  バインド変数が渡された場合は、値のループ処理を実施する。
      3. 各バインド変数の値を文に設定する。(JDBCのバインド変数APIは1から始まる番号付けを使用するため、0から始まるforループのインデックス変数にコードで1を加えていることに注意する。)
      4. 文を実行する。
      5. 文をクローズする。
      【Helper】
      protected void callStoredProcedure(String stmt, Object[] bindVars) {
        PreparedStatement st = null;
        try {
          // 1. JDBC PreparedStatement を生成
          st = getDBTransaction().createPreparedStatement("begin "+stmt+";end;",0);
          if (bindVars != null) {
            // 2. バインド変数が渡された場合は、値を取得する。
            for (int z = 0; z < bindVars.length; z++) {
              // 3. PreparedStatementにパラメータをセットする。
              st.setObject(z + 1, bindVars[z]);
            }
          }
          // 4. ステートメントを実行。
          st.executeUpdate();
        }
        catch (SQLException e) {
          throw new JboException(e);
        }
        finally {
          if (st != null) {
            try {
              // 5. ステートメントをクローズ。
              st.close();
            }
            catch (SQLException e) {}
          }
        }
      }


      2011年8月23日火曜日

      Call Stored Procedure① (OracleADF)

      Oracle ADFからストアド・プロシージャをコールするサンプル。DBTracsactionインターフェースのexecuteCommand()メソッドを使用して procedure_with_no_argsプロシージャをコールする。
       
      // In StoredProcTestModuleImpl.java
      public void callProcWithNoArgs() {
        getDBTransaction().executeCommand(
          "begin dev_sample.procedure_with_no_args; end;");
      }

      2011年8月20日土曜日

      TEMP Estimation

      [Reuquirement Defenition & Design]
      TEMP表領域を見積場合、最大取得テーブル件数の2倍が最初の見積

      [Intgration Test]
      Temp表領域のHWM、負荷テストにおけるTEMP表領域のHWM(特にオンライン負荷を徹底的に)

      ===領域管理をLOCALとした場合===
      v$temp_extent_pool を使用したSQL。RACの場合、gv$temp_extent_pool

      SELECT d.tablespace_name "Tablespace",
                      to_char(nvl(t.hwm, 0)/1024/1024,'99999990.999')  "Used (MB)"
      FROM    sys.dba_tablespaces d,
                     (SELECT tablespace_name, sum(bytes_cached) hwm
                      from v$temp_extent_pool group by tablespace_name) t
      WHERE d.tablespace_name = t.tablespace_name(+)
      AND       d.extent_management like 'LOCAL'
      AND       d.contents like 'TEMPORARY'
      ;


      ===領域管理をDICTIONARYとした場合===
      SELECT  total.TABLESPACE_NAME "Tablespace",
                       to_char((A/1024/1024 - B/1024/1024),'99999990.999') "Used(MB)"
      FROM
            (SELECT       sum(bytes) A,
                                   tablespace_name
              FROM          dba_data_files
              GROUP BY tablespace_name) TOTAL,
            (SELECT       sum(bytes) B,
                                   tablespace_name
              FROM         dba_free_space
              GROU BY  tablespace_name) FREE
      WHERE   total.TABLESPACE_NAME=free.TABLESPACE_NAME(+)
      AND        total.TABLESPACE_NAME='TEMP_DIC';



      2011年8月19日金曜日

      Oracle Application FAH (仕訳転送テンポラリテーブル)

      Oracle Application のFAHは仕訳転送後のGLへのインポート時にGL_INTERFACEのようなテンポラリテーブルを作成する。(GL_INTERFACEはテンポラリではなく通常のテーブルである。)テンポラリテーブルは、そのままDBに残る為、パージプログラムを実施する必要がある。パージ・プログラムは、GLの会計期間がクローズされていない限り、有効にならない。

      また、FAHで蓄積されていく取引データはGLのパージと連動して設計することが原則である。それはFAHが提示している機能を使用することを前提とした場合のオラクルの設計方針になっている為である。

      2011年8月18日木曜日

      UNDO TBS Estimation

      実績ベースのUNDOの見積は以下の考え方で実施する。
      OTN & KROWNで判る。また、R10.1より、V$UNDOSTAT の TUNED_UNDORETENTION でUNDO_RETENTIONはチューニングが実施されている。

      (A × B + 64 ÷ C + D × 2) × C + 余裕値(単位:キロバイト)

      A:UNDO_RETENTIONの値(0の場合は1)
      B:V$UNDOSTATビューのUNDOBLKSの値を600で除算した値
              一番更新が多い時間帯のレコードを元にすること
              事前見積の場合は1秒あたりの発生UNDOブロック数を仮定
               (1秒あたりのブロック数をどのように見積れば?)

      C:ブロックサイズ(2/4/8/16/32のいずれか)
      D:V$UNDOSTATビューのMAXCONCURRENCYの値
              事前見積の場合は最大同時トランザクション数を仮定


      <<UNDO_RETENTION < TUNED_UNDORETENTION の考え方>>

        |<---------------------- TUNED_UNDORETENTION ------------------>|
        |<--- UNDO_RETENTION ---->|                                                       |
        |+++++++++++++++++++++++ |++++++++++++++++++++++++|
        |<---------- 完全に保証 ---------->|<--- 保証されるとは限らない --->|

      2011年8月16日火曜日

      Oracle Applications [GL]

       OracleEBS 12.1.1 Information.
       
      ApplicationGL - General Ledger
      Table222 Tables
      View282 Views
      Concurrent Program278 Concurrent Programs
      Lookup190 Lookup Types
      File12 Diagrams & Reports
      Event16 Workflow Events 

      V$CACHE

       データベース・バッファ・キャッシュ上にあるオブジェクトをブロック順に降順に並べる
       スクリプト .catclust.sql, catparr.sqlをsysdba権限のあるユーザーで実施すると
       v$cacheが作成される。
      ========================================================================
      SELECT    dbu.username        OWNER_NAME
               ,vca.name            OBJECT_NAME
               ,vca.partition_name  PARTITION_NAME
               ,vca.kind            OBJECT_TYPE
               ,count(*)            BLOCK_COUNT
      FROM     v$cache vca,  DBA_USERS dbu
      WHERE    vca.owner# <> 0
      AND      vca.owner# =  dbu.user_id
      GROUP BY dbu.username, vca.name, vca.partition_name, vca.kind
      ORDER BY count(*) desc
      ;

      ========================================================================

      About Oracle SQL Developer

      SI Object Browser、PL/SQL Developerは、Oracle PL/SQL の開発やDBA管理に有効なツールだったけど、今はOracle SQL Developerが一押しである。通常のDML操作、DDL作成、PL/SQL開発(デバック機能含)だけでなく、UT Function等のUnit Test用の機能とPL/SQL Profilerを利用したCoverlage機能、Oracle社が提示している各種レポート機能(DBA系やCPU上位別SQL)、リアルタイムSQLモニタリング 、ドリルダウンによる実行計画の把握等、前はScriptにしてテキストファイルで大事に持っていた機能がツール化されている。更にSQL Developer Modelingと呼ばれるERツールとも連携しています。それが全てフリーで使えるのは素晴らしい。(決して、オラクル社の回し者ではない)
       まあ、ますます、技術の中身を理解していく人が少なくなっていく気がするのだが、それは今の流れなのかもしれない。