OceanBaseデータベースでは、ストアドプロシージャ(Stored Procedure)はユーザー業務ロジックの重要な媒体です。現在の実装では、ストアドプロシージャ内のトランザクションコミットは同期方式を採用しており、ワーカースレッドがトランザクションコミットインターフェースを呼び出した後、トランザクションコミットが完了するまでブロックされ、処理を返すことができません。極端な場合を除き、ローカルトランザクションのコミット時間はほとんどの場合マイクロ秒単位であり、分散トランザクションのコミット時間はミリ秒単位です(主にネットワーク通信遅延による)。そのため、分散トランザクションが発生すると、PL全体の遅延が大幅に増加し、スループットも大幅に低下します。この問題を緩和し、PLの性能をさらに向上させるため、V4.4.2バージョンではPL非同期コミットの最適化をサポートしています。
PL非同期コミット最適化の有効化
ob_enable_pl_async_commit システム変数を使用して、この最適化を有効にするかどうかを制御します。 システムのスループットまたはTPSがビジネス要件を満たせない場合、ob_enable_pl_async_commit を有効にしてPL非同期コミット最適化を有効にすることを試すことができます。ほとんどのコミットシナリオである程度のパフォーマンス向上が見られ、高並行性シナリオではシステムのスループットが大幅に向上します。
使用例
テストテーブルを作成します。
obclient> CREATE TABLE test1(a int); obclient> CREATE TABLE test2(a int);ストアドプロシージャ
testを作成します。obclient> CREATE OR REPLACE PROCEDURE test(b int) AS a int; BEGIN FOR i IN 1..b LOOP FOR j IN 1..100 LOOP insert into test1 values(a); commit; if a = 0 then a := 1; else a := i + 1; end if; insert into test2 values(a); commit; END LOOP; END LOOP; delete from test1; delete from test2; end; /パフォーマンス比較テストを実行します。
PL非同期コミット最適化を有効にします。
obclient> SET ob_enable_pl_async_commit=ON; obclient> call test(10); Query OK, 0 rows affected (9.487 sec) obclient> call test(10); Query OK, 0 rows affected (9.808 sec) obclient> call test(10); Query OK, 0 rows affected (10.013 sec) obclient> call test(10); Query OK, 0 rows affected (10.032 sec) obclient> call test(10); Query OK, 0 rows affected (9.280 sec)PL非同期コミット最適化を無効にします。
obclient> SET ob_enable_pl_async_commit=OFF; obclient> call test(100); Query OK, 0 rows affected (10.788 sec) obclient> call test(100); Query OK, 0 rows affected (11.616 sec) obclient> call test(100); Query OK, 0 rows affected (11.264 sec) obclient> call test(100); Query OK, 0 rows affected (10.378 sec) obclient> call test(100); Query OK, 0 rows affected (10.832 sec)
上記の例では、ループを使用して2つのテストテーブルにバッチでデータを挿入し、各操作後に即座にコミットします。最適化を有効にした場合の平均所要時間は
9.724秒です。最適化を無効にした場合の平均所要時間は10.976秒です。パフォーマンス向上は約11.41%です。1回のトランザクションで処理するデータ量が多く、トランザクションが大きく、コミットに時間がかかるほど、SQLとの並列処理の効果が高まり、パフォーマンス向上も大きくなります。