本記事では、OceanBaseの基本的な並列実行のチューニングテクニックについて説明します。
統計情報の手動収集
オプティマイザーに保存されている統計情報が古くなると、生成される実行計画が最適でない可能性があります。V3.2 と V4.1 では、それぞれ手動で統計情報を収集するためのインターフェースが提供されています:
V3.2 バージョン
V3.2 でのメインテーブルの手動統計収集の構文は以下のとおりです(インデックステーブルはサポートされていません):
MySQLモード構文:
-- まず、analyze構文のサポートを有効にする必要があります:
ALTER SYSTEM SET enable_sql_extension = true;
-- ユーザーTESTのテーブルT1の統計情報を収集し、すべての列のバケット数をauto戦略に設定します:
ANALYZE TABLE T1 COMPUTE STATISTICS FOR ALL COLUMNS SIZE AUTO;
Oracleモード構文:
-- ユーザーTESTのテーブルT1のグローバルレベルの統計情報を収集し、すべての列のバケット数をauto戦略に設定します:
CALL dbms_stats.gather_table_stats('TEST', 'T1', granularity=>'GLOBAL', method_opt=>'FOR ALL COLUMNS SIZE AUTO');
-- または、analyze構文を使用します:
-- ユーザーTESTのテーブルT1の統計情報を収集し、すべての列のバケット数をauto戦略に設定します:
ANALYZE TABLE T1 COMPUTE STATISTICS FOR ALL COLUMNS SIZE AUTO;
V4.1 バージョン
V4.1 でのメインテーブルおよびインデックステーブルの手動統計収集の構文は以下のとおりです:
MySQLモード構文:
-- ユーザーTESTのテーブルT1のグローバルレベルの統計情報を収集し、すべての列のバケット数をauto戦略に設定します:
CALL dbms_stats.gather_table_stats('TEST', 'T1', granularity=>'GLOBAL', method_opt=>'FOR ALL COLUMNS SIZE AUTO');
-- ユーザーTESTのテーブルT1のインデックスIDXの統計情報を収集し、並列度を4に設定します(IDXは一意ではないため、テーブル名を指定する必要があります):
CALL dbms_stats.gather_index_stats('TEST', 'IDX', degree=>4, tabname=>'T1');
Oracleモード構文:
-- ユーザーTESTのテーブルT1のグローバルレベルの統計情報を収集し、すべての列のバケット数をauto戦略に設定します:
CALL dbms_stats.gather_table_stats('TEST', 'T1', granularity=>'GLOBAL', method_opt=>'FOR ALL COLUMNS SIZE AUTO');
-- ユーザーTESTのインデックスIDXの統計情報を収集し、並列度を4に設定します(IDXは一意であるため、テーブル名を指定する必要はありません):
CALL dbms_stats.gather_index_stats('TEST', 'IDX', degree=>4);
Partition Wise Joinを使用したパーティショニングの変更
PoCシナリオにおいて、大規模なテーブル JOIN が存在し、かつビジネス上許容される場合、これらの大規模テーブルに同じパーティショニング方式を適用し、同一のテーブルグループにバインドすることで、パフォーマンス最適の partition wise join を実現できます。
partition wise join を使用する際は、並列度もパーティション数に応じて調整することで、最適なパフォーマンスを得られます。
並列度とパーティション数の適合
一般的に、並列度とパーティション数が一定の整数比になっている場合、良好なパフォーマンスが得られます。
詳細については、パラレル実行 の負荷均等化によるパフォーマンス最適化を参照してください。
適切なインデックスの作成
適切なインデックスを作成することで、データのスキャン量を削減し、パラレル実行のパフォーマンスを向上させることができます。どのテーブルや列にインデックスを作成するかには、一般的なルールはなく、具体的なSQL文に基づいて個別に分析する必要があります。
レプリケーションテーブルの作成
V4.2以降では、レプリケーションテーブルを作成することでデータ再分散を削減し、並列実行のパフォーマンスを向上させることができます。基本的な構文例は以下のとおりです:
CREATE TABLE dup_t1(c1 int) duplicate_scope = 'cluster';