CodeZine(コードジン)

特集ページ一覧

大量データのアクセス範囲を限定する「パーティショニング」とは? 用途と注意点を解説

オラクル技術エキスパートが紹介する 開発者のためのデータベース完全ガイド 第3回

  • LINEで送る
  • このエントリーをはてなブックマークに追加

目次

1つの表を分割する

 Oracle7パーティション・ビューはレンジ・パーティションを実現する原始的な実装でした。複数の表を連結するという実装は各パーティションにローカル・パーティション索引しか作成できないため、Oracle8パーティション表でパーティショニングの実装は完全に作り変えられました。それは1つの表を分割するという概念です。

 Oracle8パーティション表は1つの表なのでパーティション表に作成した索引のポインタも全行アドレスを指すことができます。そのため、表パーティションに閉じたローカル・パーティション索引だけでなく、表パーティションをまたがった索引を作成することができます。これをグローバル索引といいます。

Oracle8 パーティション表
Oracle8 パーティション表

 グローバル索引は、通常の非パーティション表の索引と同様に1つの索引が全行のポインタを持つグローバル非パーティション索引と、索引を作成する列をパーティショニング・キーとしてパーティショニングしたグローバル・パーティション索引があります。グローバル・パーティション索引は表のパーティション・キー列と無関係に、索引のパーティション・キーを指定できます。

 また、第2回でOracle Databaseのヒープ表に作成する索引はどれも表の行アドレスへのポインタを持っており、どの列の索引も特別扱いしないと説明しました。グローバル索引は表のパーティション・キーとは関係ないため、クエリーが表のパーティション・キー列を指定していない場合でも、非パーティション表の索引と同様のアクセス・パスで表データにアクセスできます。そのため、グローバル索引は一意制約の索引となることができるので、プライマリ・キー制約の索引になることもできます。つまり、複数の表を連結する実装のところで説明した、ローカル・パーティション索引しか作成できない場合の制約事項「パーティション表の一意索引はパーティション・キー列を含めなければならない」がなくなります。

性質の異なるワークロード向けのデータ構造を重ね合わせる

 Oracle8パーティション表の実装では、表のパーティショニングと索引の関係が独立したため、分析や集計処理ではパーティション・プルーニングが起こるように表パーティション・キー列を定義し、トランザクション系処理では表パーティション・キーとは無関係にトランザクション系処理に必要な索引を作成することができます。そのためSQLの記述も分析や集計処理とトランザクション系処理それぞれに必要な列だけ記述すればよく、インターフェースと実装の分離が守られています。

 第1回のSQL実行モデルで、SQLはデータの抽象空間を操作する言語であるという趣旨の説明をしました。索引やパーティショニングはデータ構造の実装ですが、実装の制限がインターフェースであるSQLの記述に跳ね返るべきではありません。ローカル・パーティション索引しか作成できないDBMSでは、パーティション・プルーニングをかけるためにクエリーにプライマリ・キーを含める必要があります。

性質の異なるワークロード向けのデータ構造の重ね合わせ
性質の異なるワークロード向けのデータ構造の重ね合わせ

 Oracle Databaseのヒープ表と索引は独立した関係にあるため、表のパーティショニングと独立した索引を作成することができました。しかし、クラスタリング索引(索引構成表)の場合は行の位置がプライマリ・キー索引と強固に結びついているため、表のパーティショニングをするにしても行の位置の範囲がプライマリ・キー索引の値の範囲に拘束されます。クラスタリング索引(索引構成表)はプライマリ・キー索引アクセスのみを高速化するデータ構造です。しかしそれで得られるメリットはごくわずかでしかないのに2次索引や表のパーティショニングと組み合わせる場合のデメリットが大きすぎるためOracle Databaseではほぼ使用されなくなったデータ構造です。

大量のデータを移動させない

 オンライン・トランザクション処理のようにごく少数のデータにアクセスする場合と、分析や集計処理のように大量のデータにアクセスする場合では、最適なアルゴリズムとデータ構造は異なります。ごく少数のデータの位置を特定するには索引が使用され、大量のデータの位置を範囲で絞りこむにはパーティショニングが使用されます。これらのデータ構造を重ね合わせることができないDBMSを使用してシステムを設計すると、トランザクション系処理が生成したデータを分析や集計処理するために、トランザクション系のデータベースと分析や集計系のデータベースを別にし、これらのデータベース間で大量のデータを移動させるという構成になります。異なるワークロードに適したデータ構造を重ね合わせることができるDBMSを使用すると「大量のデータを移動させない」という設計も可能になります。

まとめ

 今回は大量のデータにアクセスする場合にアクセスする範囲を限定するデータ構造であるパーティショニングについて解説しました。ごく少数のデータにアクセスする場合と大量のデータにアクセスする場合では最適なデータ構造が異なり、それを重ね合わせることができるかどうかでシステム全体の設計が変わり得るということを説明しました。ローカル・パーティション索引しか作成できないDBMSではトランザクション系処理にパーティション表を適用することが不適切な場合があります。また、データのパーティショニングは複数台のサーバーでデータベースを構成するクラスタ・データベースとも強い関係があります。クラスタ・データベースはいつか扱う予定です。

 次回は大量のデータにアクセスする分析や集計処理で使用されるアルゴリズム実装であるパラレル実行について扱います。パラレル実行は今回説明したパーティショニングと強い関係があります。



  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:オラクル技術エキスパートが紹介する 開発者のためのデータベース完全ガイド

著者プロフィール

  • 日下部 明(日本オラクル株式会社)(クサカベ アキラ)

     日本オラクル株式会社でOracle Databaseを担当するエンジニア。主にOracle Real Application Clustersを中心とする高可用性構成や性能チューニングの問題解決およびコンサルティングに従事。著書に「これは使えるOracle新機能活用術」(翔泳社)。

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5