OceanBaseデータベースにおいて、テーブルは最も基本的なデータ格納単位です。テーブルにはすべてのユーザーがアクセス可能なデータが含まれており、各テーブルは複数の行で構成され、各行は複数の列で構成されます。各テーブルの設計と使用は、業務要件に基づいて適切に計画する必要があり、システムの効率性と拡張性を確保するために不可欠です。
OceanBaseデータベースでサポートされているテーブルタイプには、パーティションテーブル、レプリケーションテーブル、主キーテーブル、主キーのないテーブル、外部テーブルなどがあります。
- パーティションテーブル:OceanBaseデータベースでは、通常のテーブルのデータを一定のルールに従って複数のブロックに分割し、同一ブロックのデータを物理的にまとめて保存することができます。このようにブロックに分割されたテーブルをパーティションテーブルと呼びます。OceanBaseデータベースの基本的なパーティション戦略には、範囲 (Range) パーティション、リスト (List) パーティション、ハッシュ (Hash) パーティションが含まれます。
- レプリケーションテーブル:レプリケーションテーブルは、OceanBaseデータベースにおける特殊なテーブルです。この種のテーブルは、任意の「正常」なレプリカでデータの最新の変更を読み取ることができます。
- 主キーテーブルと主キーのないテーブル:主キーテーブルとは主キーを含むテーブルのことです。主キーが指定されていないテーブルは主キーのないテーブルと呼ばれます。
- 外部テーブル:データベース内のテーブルデータはデータベースのストレージ領域に格納されますが、外部テーブルのデータは外部ストレージサービスに格納されます。
テーブルタイプ
APシナリオ において、OceanBaseは多様なテーブルタイプをサポートしています。TPシナリオ で一般的な レプリケーションテーブル、パーティションテーブル、主キーテーブル、主キーのないテーブル に加え、データの格納方式(行単位か列単位か)という新たな観点から、カラムストアテーブル と 行列混合テーブル が導入されています。
カラムストアテーブル:カラムストアテーブルはデータを行ではなく列単位で格納するため、分析クエリのパフォーマンスを大幅に向上させることができます。特に、データ量が多く集計分析を頻繁に行うシナリオに適しています。詳細については、カラムストアテーブルのアーキテクチャをご参照ください。
行列混合テーブル:行単位と列単位のデータをそれぞれ別々に格納しており、システムはクエリステートメントに基づいて、行ストアと列ストアのどちらでクエリを実行する方がパフォーマンスが優れているかを自動的に判断します。トランザクション業務と分析業務の両方を扱うシナリオに適しています。
データ分布
OceanBaseデータベースは、パーティションテーブルを作成することでデータを異なるパーティションに分散します。異なるパーティションのデータは異なるマシンに配置でき、クエリ時にはパーティションプルーニングを利用してデータのスキャン範囲を削減し、複数のマシンのリソースを活用してクエリパフォーマンスを向上させることができます。デフォルトでは、異なるテーブル間のデータはランダムに分散しており、直接的な関連性はありません。ロードバランシングを利用することで、あるテーブルのデータをクラスタ全体に比較的均等に分散させることができます。
分散型APシステムでは、テーブルのデータ量は通常多くなります。異なるテーブルのデータがランダムに分散している場合、テーブル結合時のデータ転送コストはしばしば無視できません。テーブルグループ(Table Group)を利用することで、パーティション方式が同じパーティションテーブルのデータを特定のルールに従って整列させ、関連性のあるデータを同一マシン上に集約することができます。これにより、これらのテーブルを結合する際にPartition Wise Join方式で実行でき、結合シナリオにおけるデータ転送コストを効果的に削減し、パフォーマンスを向上させることができます。
OceanBaseはパーティションテーブルとサブパーティションテーブルをサポートしており、RANGEパーティション、LISTパーティション、HASHパーティションの3種類のパーティションタイプをサポートしています。
OceanBaseは3種類のプロパティを持つテーブルグループを提供しています:
NONE:テーブルグループ内のすべてのテーブルのすべてのパーティションが同一マシン上に集約されます。
PARTITION:テーブルグループ内の各テーブルのデータはパーティション単位で分散されます。サブパーティションテーブルの場合、パーティション内のすべてのサブパーティションがまとめられます。
ADAPTIVE:テーブルグループ内の各テーブルのデータは適応型方式で分散されます。テーブルグループ内のテーブルがパーティションテーブルの場合はパーティション単位で、サブパーティションテーブルの場合は各パーティション下のサブパーティション単位で分散されます。
詳細については、データ分布、MySQLモードのテーブルグループ、Oracleモードのテーブルグループをご参照ください。
インデックスタイプ
インデックスはクエリパフォーマンスを向上させるための重要なコンポーネントです。OceanBaseはAPシナリオにおいて多様なインデックスタイプをサポートし、ユーザーに柔軟で効率的なデータ検索方法を提供します。以下は一般的なインデックスタイプとその適用シナリオです:
- ローカルインデックス:ローカルインデックスは単一のパーティションに対して構築されるインデックスで、データの局所的なクエリが必要なシナリオに適しています。データが厳密に複数のパーティションに分割されている場合、ローカルインデックスはクエリ時のデータスキャン範囲を大幅に縮小し、クエリ効率を向上させることができます。
- 一意インデックス:一意インデックスは、データ列内の各値が一意であることを保証します。特定の列に一意インデックスを作成することで、データベースはデータ重複を効果的に防ぎ、クエリ処理を高速化できます。
- 非一意インデックス:非一意インデックスは一意インデックスとは異なり、列内のすべての値が一意である必要はありません。主にデータクエリの高速化に使用され、特に特定の条件に合致する複数のレコードを検索する場合、検索効率を大幅に向上させることができます。
- 全文インデックス:OceanBaseはMySQL互換の全文検索機能をサポートしており、テキスト内容を事前処理してキーワードインデックスを構築することで、全文検索の効率を効果的に向上させます。全文インデックスの詳細については、全文インデックスをご参照ください。
- JSON複数値インデックス:OceanBaseデータベースのMySQLモードは複数値インデックス機能をサポートしており、これはJSONドキュメントやその他の集合データ型に特に役立ちます。この機能を利用することで、配列やコレクションにインデックスを作成し、JSON配列要素に基づく検索のクエリ効率を向上させることができます。複数値インデックスの詳細については、複数値インデックスをご参照ください。
- 空間インデックス:空間インデックスは地理空間データのクエリ効率を最適化するために使用され、地理情報システム(GIS)や位置関連サービスで広く利用されています。これらのアプリケーションでは、空間インデックスは地理座標範囲内のデータ情報を迅速に検索できるため、位置サービスを強力に支援します。
- カラムストアインデックス:HTAP(Hybrid Transactional and Analytical Processing)シナリオにおいて、OceanBaseデータベースはV4.3.0バージョンから、テーブル作成時にそのストレージ形式をカラムストアとして指定できるようになりました。インデックスもデータテーブルと同様にテーブルであるため、インデックステーブル内のデータもカラムストア形式で保存する設定が可能です。カラムストアインデックスは列単位で保存されるため、分析クエリのパフォーマンスを大幅に向上させることができます。特に大規模データを処理する際には、データ検索と分析の時間を大幅に短縮し、リアルタイム分析を実現できます。カラムストアの詳細については、カラムストアをご参照ください。
インデックスの詳細については、MySQLモードのインデックスの概要とOracleモードのインデックスの概要をご参照ください。
データ型
テーブルの作成と使用の前に、データベース管理者はビジネスニーズに基づいてテーブル構造とデータ型を適切に計画する必要があります。データストレージの効率とクエリの最適化を確保するため、管理者は以下の原則に従う必要があります:
- テーブル構造の正規化:テーブル構造を適切に設計することで、データの冗長性を最小限に抑え、クエリ効率を向上させます。
- 適切なSQLデータ型の選択:各列に最も適したSQLデータ型を選択することで、ストレージ容量を節約し、クエリ速度を向上させます。
一般的なSQLデータ型には以下のものが含まれます:
- 基本データ型:例えば
INT、VARCHAR、DATEなどです。 - 複合データ型:例えば
JSON、ARRAY、BITMAPなどで、より複雑なデータ構造の格納に適しています。
詳細なSQLデータ型の説明については、以下を参照してください:
ビュー
OceanBaseデータベースは、標準ビューとマテリアライズドビューをサポートしています。
- 標準ビュー(Standard Views):標準ビューは非マテリアライズドビューとも呼ばれ、最も一般的なビューのタイプです。これらはビューの定義を表すSQLクエリのみを格納し、クエリ結果は格納しません。
- マテリアライズドビュー(Materialized Views):マテリアライズドビューは標準ビューとは異なり、物理的にクエリの結果を保持します。OceanBase データベースは非同期マテリアライズドビューをサポートしており、基礎テーブルのデータが変更されても、マテリアライズドビューは即座に更新されないため、基礎テーブルのDML操作の実行パフォーマンスが保証されます。MySQLモードのマテリアライズドビューおよびOracleモードのマテリアライズドビューをご参照ください。
データ作成例
パーティション、カラムストア、行ストアインデックスを含むテーブルを作成します。
CREATE TABLE salesdata (
sale_id INT,
product_id INT NOT NULL,
saledate DATE NOT NULL,
saledate_int INT, -- 通常の列として定義
quantity INT,
price DECIMAL(10, 2),
customer_id INT,
PRIMARY KEY (sale_id, saledate_int) -- 主キーに通常の列を含めることができます
)
PARTITION BY RANGE COLUMNS (saledate_int) (
PARTITION p2023_q1 VALUES LESS THAN (202304),
PARTITION p2023_q2 VALUES LESS THAN (202307),
PARTITION p2023_q3 VALUES LESS THAN (202310),
PARTITION p2023_q4 VALUES LESS THAN (202401)
)
WITH COLUMN GROUP(each column);
CREATE INDEX idx_product_id ON salesdata(product_id);
CREATE INDEX idx_customer_id ON salesdata(customer_id);
パーティション:
salesdataテーブルは 範囲パーティション(RANGE)を使用します。PARTITION BY RANGE COLUMNS (saledate_int):saledate_int列によってパーティションを分割します。4つのパーティションを定義しています:
p2023_q1パーティションには202304より前のすべてのデータ(つまり2023年第1四半期)が含まれます。p2023_q2、p2023_q3、p2023_q4パーティションは、2023年の第2、第3、第4四半期のデータをそれぞれカバーします。
カラムストア:
WITH COLUMN GROUP(each column);により カラムストア を指定しました。これらの列のデータはカラムストア方式で保存され、大規模なデータ分析シナリオに適しています。行ストアインデックス:
product_id列とcustomer_id列に対して、それぞれインデックスidx_product_idとidx_customer_idを作成しました。行ストアインデックスは、特定の列に基づくクエリ、特に頻繁に実行される小さなクエリを高速化することができます。
カラムストアテーブルを作成して使用する際、大量のデータをインポートした場合は、読み取り性能を向上させるためにメジャーコンパクション操作を1回実行し、統計情報収集を行って実行戦略を調整する必要があります。
メジャーコンパクション操作:データを一括インポートした後、メジャーコンパクション操作を1回実行することを推奨します。これは、断片化されたデータを整理し、物理的に連続した状態にすることで、読み取り時のディスクI/Oを削減し、読み取り性能を向上させるのに役立ちます。データインポート後、テナント内でメジャーコンパクション操作を1回トリガーし、すべてのデータがベースライン層にメジャーコンパクションされていることを確認してください。操作については、MAJOR AND MINOR (MySQLモード)およびMAJOR AND MINOR (Oracleモード)をご参照ください。
統計情報収集:メジャーコンパクション操作完了後、統計情報の収集を行うことを推奨します。これは、オプティマイザーが有効なクエリ計画と実行戦略を生成するために非常に重要です。GATHER_SCHEMA_STATS(MySQLモード) /GATHER_SCHEMA_STATS(Oracleモード)を実行して、すべてのテーブルから統計情報を収集し、ビューGV$OB_OPT_STAT_GATHER_MONITOR(MySQLモード)およびGV$OB_OPT_STAT_GATHER_MONITOR(Oracleモード)で収集進捗を監視できます。
なお、カラムストアテーブルのデータ量が増加するにつれて、メジャーコンパクション操作の速度が低下する可能性があるため注意が必要です。