FC2ブログ

晴川雨読

晴れている時は川へ、雨の日は川に関する情報収集をします。

Oracle12c 新機能 不可視列

Oracle12cで、カラムを見えなくさせる機能が実装された。
しかし、12c新機能 不可視列 - Invisible column にある通り、invisible にした後、visible に戻すとディクショナリ上のカラム順番が変わるらしい。
いや~使えん機能だこと。
マニュアル へのリンクが記事上切れていたので貼っておく。

試してみるともっとやばい事象が発生。
1.A, B というカラムで T テーブル作る。
2.INSERT INTO T VALUES( 1, 2);
3.A を invisible⇒ visibleとする
 desc すると、B、Aという順番になる
4.INSERT INTO T VALUES( 3, 4);
5.select * from T
B A
1 2
3 4
というカオス結果となる。ディクショナリ上の定義は変わっているが、
データ上の順番は変わっていないので、変更前に入れたデータは古い場所のまま。
データ上のカラムの順番を知るすべはないので、データが入っている状態でやると何がどうなったかトレース不可能。

カラムの順番を変える裏技に使えるかな?と思ったが、絶対に使ってはいけない機能だと認識した。
スポンサーサイト

Oracle12c の SQL*Loader のオプション値変更

ROWS=-1 とすると、一発コミットだったらしいが、マイナス値は許容されなくなった。
マニュアル を見ると、65534 が最大だと書いてあるが最小はいくつか書いていない。
ネットでは、ROWS=-1=無限大 という記載がけっこうあるが、12c~7 のマニュアルを見直したが、そんな記述は見つからなかった。
都市伝説?
まぁそれは良いとして、何も書かず変更するなよ。
ちなみに、12cのマニュアルに

従来型パス・ロードでは、指定した値が許容可能な最大行数の65534を超えているため、次の例はエラーになります。

ROWS=65900

と書いてあるが、エラーにはならない。どういう動きになるかは不明。
嘘ばっかかきやがって。

同じ感じで、ERRORS=-1 もエラーとなるようになった。

ALL_TAB_MODIFICATIONS

Oracle11gでは、DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO を叩かないといつ反映されるかわからないものだったが、
Oracle12c リリース2 からは、叩かなくてもリアルタイムに更新されるようになった。

ALL_TAB_MODIFICATIONS から、前回統計情報を取得した時より後のテーブルへの INSERT/UPDATE/DELETE 件数を知ることが出来る。
統計情報取得日時は、ALL_TABLES.LAST_ANALYZED 見ればわかるので、ある2つの時点でその情報を取っておけば、その期間の処理件数の大まかなものはわかる。

実際に見てもふーんと思ったのは次の点
・コミットしなくてもカウントアップされる
 逆に言うとロールバックしても値は減らない。
・TRUNCATE すると INSERT の件数と同値が DELETE にせっていされる

試さなかったが、同じレコードを何回更新しても UPDATEのカウンタは上がっていくと思われる。
ALL_TAB_MODIFICATIONS を見て自動の統計情報取得実行有無を決めているはずだから、意外といいかげんに取得が行われるようだ。

外部表(External table) の ROWID

ファイルの上から連番付けたいけど、他のテーブルと結合したりすると順番が変わってしまうからどうしたものかと考えた。
ROWID で並べれば良いかと思い、外部表の ROWID を見たら全部同じだった。

・外部表のファイルに nl などで事前にナンバリングしておく。
・WITH句で外だし+ROWNUMつける。WITHのインラインビューがマージされないようにNO_MERGEヒントを付ける。

出来る手としては、これぐらいかな。

ディクショナリの検索が遅い

基盤チームがDB出来ました!って持ってきたのを使うと、ディクショナリの検索が激遅。
DBA_SEGMENTS などの検索が全然返ってこない。

仕方ないので、DBMS_STATS.GATHER_FIXED_OBJECTS_STATSDBMS_STATS.GATHER_DICTIONARY_STATS を実行した。
自動ではこれらの統計は取られないからね。基盤だったら当たり前のように取れや!
統計取られていない Oracle はクソですからね。

統計取る時、no_invalidate => false オプション付けましょうね。
そうしないと、新しい実行計画でやってくれないから。
次のページ

FC2Ad