OceanBaseデータベースでは、ストアドプロシージャ(Stored Procedure)はユーザー業務ロジックの重要な媒体です。現在の実装では、ストアドプロシージャ内のトランザクションコミットは同期方式を採用しており、ワーカースレッドがトランザクションコミットインターフェースを呼び出した後、トランザクションのコミット完了をブロッキング待機し、完了後に戻る必要があります。極端な場合を除き、ローカルトランザクションのコミット時間はほとんどの場合マイクロ秒単位であり、分散トランザクションのコミット時間はミリ秒単位です(主にネットワーク通信遅延による)。そのため、分散トランザクションが発生すると、PL全体の遅延が大幅に増加し、スループットも大幅に低下します。このため、V4.4.2バージョンではPL非同期コミットの最適化をサポートし、上記の問題を緩和し、PL性能をさらに向上させています。
PL非同期コミット最適化の有効化
ob_enable_pl_async_commit システム変数を使用して、この最適化を有効にするかどうかを制御します。 システムのスループットまたはTPSがビジネス要件を満たせない場合、ob_enable_pl_async_commit を有効にしてPL非同期コミット最適化を有効にすることを試すことができます。ほとんどのコミットシナリオで一定のパフォーマンス向上が見られ、高並行性シナリオではシステムのスループットが大幅に向上します。
使用例
テストテーブルを作成します。
obclient> CREATE TABLE test1(a int);ストアドプロシージャ
testを作成します。obclient> DELIMITER $$ CREATE PROCEDURE test() BEGIN DECLARE counter INT DEFAULT 1; WHILE counter <= 1000 DO INSERT INTO t0 (a) VALUES (counter); commit; SET counter = counter + 1; END WHILE; END $$ DELIMITER ;パフォーマンス比較テストを実行します。
PL非同期コミット最適化を有効にします。
obclient> SET ob_enable_pl_async_commit=ON; obclient> call test(); Query OK, 0 rows affected (5.376 sec) obclient> call test(); Query OK, 0 rows affected (5.122 sec) obclient> call test(); Query OK, 0 rows affected (5.131 sec) obclient> call test(); Query OK, 0 rows affected (5.117 sec) obclient> call test(); Query OK, 0 rows affected (4.946 sec)PL非同期コミット最適化を無効にします。
obclient> SET ob_enable_pl_async_commit=OFF; obclient> call test(); Query OK, 0 rows affected (5.489 sec) obclient> call test(); Query OK, 0 rows affected (5.484 sec) obclient> call test(); Query OK, 0 rows affected (5.481 sec) obclient> call test(); Query OK, 0 rows affected (5.440 sec) obclient> call test(); Query OK, 0 rows affected (5.501 sec)
データベーステーブルに1000件のデータをループ挿入し、データを挿入するたびに即座にトランザクションをコミットします。最適化を有効にした場合の平均所要時間は
5.1384sです。最適化を無効にした場合の平均所要時間は5.479sです。パフォーマンスは約6%向上します。1回のトランザクションで処理するデータが多いほど、トランザクションが大きくなり、コミットにかかる時間が長くなります。その結果、SQLとの並列処理の効果が高まり、パフォーマンス向上も大きくなります。