本記事では、OceanBaseの基本的なパラレル実行のチューニング方法について説明します。統計情報の収集、パーティション戦略の最適化、並列度の設定、インデックスの最適化、およびレプリケーションテーブルの適用をカバーします。
統計情報の手動収集
オプティマイザーの統計情報が期限切れになると、実行計画の品質が低下する可能性があります。バージョンごとの構文の違いには注意が必要です:
V3.2.xバージョン
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.xバージョン
主表とインデックス表の統計情報収集をサポートしています:
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使用時には、並列度もパーティション数に適応させる必要があり、これにより最適なパフォーマンスを得ることができます。
並列度とパーティション数の適応
一般的に、並列度とパーティション数は一定の整数比関係(例えば、パーティション数が8の場合、並列度を4、8、16などに設定)に従うと、より良いパフォーマンスが得られます。
詳細については、パラレル実行のロードバランシングによるパフォーマンスの最適化を参照してください。
適切なインデックスの作成
適切なインデックスを作成することで、データのスキャン量を削減し、パラレル実行のパフォーマンスを向上させることができます。どのテーブルや列にインデックスを作成するかについては、汎用的な解決策はなく、具体的なSQLに基づいて個別に分析する必要があります。
レプリケーションテーブルの作成(V4.2以降)
V4.2以降では、レプリケーションテーブルを作成することでデータの再分散を削減し、パラレル実行性能を向上させることができます。
レプリケーションテーブルの詳細については、レプリケーションテーブルの紹介、レプリケーションテーブル(MySQLモード)およびレプリケーションテーブル(Oracleモード)を参照してください。