本記事では、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';