大量データの処理にはパーティションも有効
パーティションは、表や索引を内部的に分割する機能だ。分割しても1つの表として扱われるが、SQLなどが扱うデータ量を削減することができる。
「パーティション大規模データベースを扱う際にはマストとなる機能だ。データウェアハウスでの多くの場合、索引は役に立たないと言い切ってよいだろう」(柴田氏)。
例えばデータベース全体の1%未満がヒットする場合は索引が有効だが、データウェアハウスにあるような、過去1年間の売上データから1カ月分の売上合計を見るといったケースでは、索引ではデータベースの性能向上は望めない。このような場合では、売上年や月ごとにデータベースをパーティション化すれば、特定年月のデータを参照するだけでよくなるため、集計作業などの処理における性能向上が期待できるのだ。
さらに、「索引スキャンは、1ブロックずつ読むので、どうしてもストレージの性能を出しづらいが、表スキャンは複数ブロックをまとめて読めるのでストレージの性能を最大限引き出せる。"同じブロック数を読むのであれば"、索引スキャンするよりも一部のパーティションだけを表スキャンするほうが速い」(柴田氏)。
表スキャンは常に悪者というイメージがあるが、実はそうでないのだ。パーティションは、取り出す行数が非常に多い場合に大きな効果を発揮し、索引とは違った方法で読み取りブロック数を大幅に削減する機能だ。
パーティションのメリットについて、さらにいくつか触れていこう。通常、表の一部をDelete文で削除すると時間がかかる。しかし、例えば売上データを月単位でパーティション表にしておけば、月単位でパーティションをドロップすることで、すぐにデータを削除できる。さらに、パーティション表はパーティション単位で圧縮することができるため、例えば過去の売上データは圧縮するとよい。古いデータに対してInsertやUpdateを行うことは少ないだろう。圧縮しておけばディスクの節約にもなるし、Selectが速くなるというメリットもある。
Oracle Databaseのパーティションには、レンジ、リスト、ハッシュの3通りの分割方法があるが、それらを組み合わせることもできる。「例えば月単位、支店単位の2つのパーティションを組み合わせることで、月別支店別の売上データに瞬時にアクセスできる。ほかにもレンジ+レンジ、レンジ+ハッシュというように自在に使えるので、ぜひ使いこなしてほしい」と柴田氏は説明する。
オラクルエンジニア通信:「Oracle Partitioning 技術資料」