ミラニスタ今週から、インターバル(時間隔)パーティションについて検証します。インターバル・パーティションとは、一言で言えば「Oracleが新規レコードの値を見て、新規パーティションが必要だったら勝手にパーティションを追加してくれる。ある事例から本題に入る前に、筆者が以前経験したことに基づくフィクションをご紹介したいと思います。(もちろんOracle11g以前のお話です。)あるサイトにおいて、特定の処理が以前と比べてだんだん遅くなっているということを聞き、調査をしました。計するというものでした。勘のいい読者の皆さんは、ここでレンジ・パーティションを使っているということにお気づきになったかと思いますが、当該表は1ヶ月単位でパーティション化されているテーブルでした。そのサイトはカットオーバー後すでに3年半以上が経過し、やっと安定稼動してきたという状況だったのですが、その処理に関しては月ごとにパフォーマンスが悪化していました。データベースにログインして確認してみると、以下のようなパーティション構成になっていました。(あくまでも実話に基づくフィクションですので、話を簡単にするため、2005年1月に運用を開始したということにします。パーティション数:36(36ヶ月分)ヒアリングしてみると、以下のようなことが判明しました。・2005年当時構築を担当された方は退職され、物理設計書等は整備されていない。・最終パーティション(P200712)に含まれるレコード数(NUM_DISTINCT)はその他のパーティションに比べ8倍以上となっていた。(2008年8月に調査)どうやら、構築担当者は構築時に3年分のパーティションを作成したものの運用手順を十分に引き継ぐことなく退職してしまい、残された運用担当者は月ごとのパーティションをメンテナンスする運用なぞ夢にも思わず、最終パーティションに新規レコードがInsertされ続けてしまった。いうのが事の真相でした。レンジ・パーティションの場合、Insertされるレコードはパーティション・キー値がHIGH_VALUE未満のパーティションに格納されます。(MAXVALUE));となります。ディクショナリから実際の定義を確認すると以下のようになります。*行1でエラーが発生しました。:ORA-14400:挿入されたパーティション・キーはどのパーティションにもマップされませんが発生してしまいます。行き場のないレコードは格納できません。構築担当者はエラーが発生しないようにこのような設定にしたのでしょう。(誰も元旦から障害対応したくないですからね。)ただし、エラーが発生しないようにしたおかげで、”問題”に気付くのが遅くなってしまいました。問題というのは何でしょうか?そうですね。パーティション化したテーブルなのに、新規レコードが全て最終パーティションにInsertされてしまうため、最終パーティションがどんどん肥大化してしまうことでした。そこで、以下のように肥大化した最終パーティションを分割して、パーティション化本来の目的を達成する必要があります。PARTITION句」により可能です。(詳細はマニュアル等で確認してください。)この事例の場合、パーティション分割で問題を解決することができると思います。将来追加されるデータに関しては、最終パーティションにデータを格納してからパーティションを分割するより、予め空の新規パーティションを追加しておく方がリスクの少ない運用ができるでしょう。いうことでパーティション追加についても確認しておきましょう。くせ者「MAXVALUE」マニュアルには以下のような記述があります。PARTITION文を使用します。PARTITION句を使用します。^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^を指定する必要があります。その結果パーティションの上限値(USER_PART_COL_STATISTICS.HIGH_VALUE)には指定した値が設定されます。「既存の上位パーティションにある各パーティション化キーのパーティションの上限がMAXVALUEの場合、表にパーティションを追加できません。そのかわり、split_table_partition句を使用して、表の始めまたは中間にパーティションを追加します。リリース1(11.1)E05750-02--------------------------ここで、整理してみましょう。あるパーティションの上限値としてMAXVALUEを設定すると、そのパーティションは必ず最終パーティションとなる。1.のパーティションの次に新規パーティションを追加することはできないので、パーティションが肥大したらsplit_table_partition句で適正なサイズに分割する必要がある。上限値としてMAXVALUEを指定しない場合、最終パーティションの上限値を超えるキー値のデータをInsertしようとすると、ORA-14400エラーが発生する。ORA-14400エラーの発生を未然に防ぐには、MAXVALUEでない上限値を指定した新規パーティションを予め追加しておく運用が必要である。置せずに、パーティションの分割や追加といったメンテナンスが必要になります。いうのがOracle10g以前のレンジ・パーティションの注意点でした。サービスの再開というメンテナンス作業を実施しました。手順どおりに実施すれば特にリスクの高い作業ではないのですが、エクスポートしたデータは1件でもインポート・ミスが許されないものであったためそれなりに緊張が強いられる作業でした。(あっ、これってフィクションのつもりでしたね。)そして、新規パーティションの追加については、定期的に手動で実行していただくようスクリプトを作成し、運用担当者に対する教育を行いました。外と手間がかかるということを実感した次第です。なって実現された”メンテナンス・フリー”となる(レンジ)パーティションが、今回検証する「インターバル・パーティション」です。マニュアルには「時間隔パーティション」という名称で記述されていますが、特に時間軸でのみパーティション化するわけでもないので、ここでは「インターバル・パーティション」という名前で呼んでいきたいと思います。常にDBAがお守りをしているデータベースは全体から見ると少ないと思います。DBAが介在することなく、パーティション表の運用がきちんとできるというこの機能の意義は大きいと思います。導入だけで随分長くなってしまいましたが、次回から「インターバル・パーティション」の全貌に迫っていきたいと思います。最近、自宅に無線LAN導入。reserved.トップページ企業概要プライバシーポリシ。