"Oracle"の記事一覧

組み込み関数の場合、返す値を考慮して実行計画を決めているらしい

インデックスのあるカラムへの絞り込み条件に組み込み関数を使った場合、 実行計画がどうなるか疑問に思ったので調べてみました。 例えば、以下のようなSQL。UPDATE_DTにインデックスがはってあるとします。 SELECT * FROM EMP WHERE UPDATE_DT > SYSDATE - 1;この場合、INDEX RANGE SCAN になりました。 片や、次のようにしたら、TABLE FULL SCANに変わりました。 SELECT * FROM EMP WHERE UPDATE_DT > SYSDATE - 10000;TO_CHAR/TO_DAT…

続きを読む

Oracleの嫌いなところ・改善してほしいところ

OracleDatabse の話。 高いとか、態度が悪いとかではなく、機能的なところの話で、普段思う嫌いなところ・改善してほしいところをリストアップします。 Oracle 以外では SQL Server、DB2、PostgreSQL、MySQL、Accessを少し使ったことがある。 (超マイナーなところでNonStop SQL/MXも。本件に関係ないのだが、HPEは、SAP HANA以外はSQL/MXを使っているという記事を見つけてびっくり。あんな、ファイルに毛が得たDBで良くやるよなって思った。) それらと比較してダメだと思ったり、単に使っていてこれ面倒、何とかならないもの…

続きを読む

ダイレクトパスの場合マテビューログに記録されないが、なぜ高速リフレッシュが出来る?

次のことをするとダイレクトパスで登録されるので、マテビューログに記録されない。 ・SQL*Loaderでダイレクトパスロード ・APPEND/APPEND_VALUES ヒントを付けてINSERT ・PARALLEL DML MOG$_XXX テーブルの中身を見ると無いのがわかる。 exec DBMS_MVIEW.REFRESH('XXX', 'f'); でも、高速リフレッシュすると、ダイレクトパスで入れたデータも反映される。 ALL_MVIEWS の LAST_REFRESH_TYPE も FAST になっている。 V$SQL のSQL_FULLTEXTをテーブル名でフィルタして、LA…

続きを読む

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.INSER…

続きを読む

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

ROWS=-1 とすると、一発コミットだったらしいが、マイナス値は許容されなくなった。 マニュアル を見ると、65534 が最大だと書いてあるが最小はいくつか書いていない。 ネットでは、ROWS=-1=無限大 という記載がけっこうあるが、12c~7 のマニュアルを見直したが、そんな記述は見つからなかった。 都市伝説? まぁそれは良いとして、何も書かず変更するなよ。 ちなみに、12cのマニュアルに 従来型パス・ロードでは、指定した値が許容可能な最大行数の65534を超えているため、次の例はエラーになります。 ROWS=65900と書いてあるが、エラーにはならない。どういう動きになるかは不明。…

続きを読む

ALL_TAB_MODIFICATIONS

Oracle11gでは、DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO を叩かないといつ反映されるかわからないものだったが、 Oracle12c リリース2 からは、叩かなくてもリアルタイムに更新されるようになった。 ALL_TAB_MODIFICATIONS から、前回統計情報を取得した時より後のテーブルへの INSERT/UPDATE/DELETE 件数を知ることが出来る。 統計情報取得日時は、ALL_TABLES.LAST_ANALYZED 見ればわかるので、ある2つの時点でその情報を取っておけば、その期間の処理件数の大まかなものはわかる。 実際…

続きを読む

外部表(External table) の ROWID

ファイルの上から連番付けたいけど、他のテーブルと結合したりすると順番が変わってしまうからどうしたものかと考えた。 ROWID で並べれば良いかと思い、外部表の ROWID を見たら全部同じだった。 ・外部表のファイルに nl などで事前にナンバリングしておく。 ・WITH句で外だし+ROWNUMつける。WITHのインラインビューがマージされないようにNO_MERGEヒントを付ける。 出来る手としては、これぐらいかな。

続きを読む

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

基盤チームがDB出来ました!って持ってきたのを使うと、ディクショナリの検索が激遅。 DBA_SEGMENTS などの検索が全然返ってこない。 仕方ないので、DBMS_STATS.GATHER_FIXED_OBJECTS_STATS、DBMS_STATS.GATHER_DICTIONARY_STATS を実行した。 自動ではこれらの統計は取られないからね。基盤だったら当たり前のように取れや! 統計取られていない Oracle はクソですからね。 統計取る時、no_invalidate => false オプション付けましょうね。 そうしないと、新しい実行計画でやってくれないから。

続きを読む

TRUNCATE の CASCADE

テーブルを TRUNCATEする時、外部キー参照されていると出来ないから、末端の子供から順番にするか、制約を無効にする必要があった。 12c では CASCADE オプションが出来たので試そうとマニュアルを見た。 CASCADEを指定すると、ON DELETE CASCADE参照制約が有効化されていて、tableを参照する子表は、すべて切り捨てられます。これは、指定したオプションを使用して、すべての子表、孫表(およびそれ以下の子表)を切り捨てる再帰的な操作になります。 ちっ、ON DELETE CASCADEついてないと使えんのかい!役立たず。 CASCADE の話ではないが、SEGME…

続きを読む

遅延セグメント作成

Oracle12.2 で マテビュー + パーティション + SEGMENT CREATION DEFERRED としたときに、セグメントが作られてしまった。 マテビュー作る時に、BUILD DEFERRED していないにもかかわらず。 パーティションテーブルの場合、8MB初期セグメントとして作られてしまい、パーティション数が多くて嫌だったので指定したのに。 わからないので他のDDLと見比べると、それだけ PARALLEL属性がついていた。 PARALLEL属性を消したら SEGMENT CREATION DEFERRED が効いた。 マニュアルには、そんなこと何も書いていない。 どうい…

続きを読む