web-dev-qa-db-ja.com

Oracle 12cのメモリテーブルへの挿入が遅い

12c(12.1.0.2.4 EE)RACでメモリ内パフォーマンスをチェックするためにいくつかのテストを実行しています。サーバーには56GBのメモリと20コアのCPUがあります。

私たちの計画は、いくつかの読み取りパフォーマンスの重要なテーブルをメモリに、残りをディスクに置くことです。テストでは、最初に挿入ツールを使用してテーブルにデータを入力し、次にJMeter(Webアプリケーションベンチマークツール)を使用してクエリを実行しました。

挿入ツールは、基本的にファイルからレコードを読み取り、レコードをDBにブロック単位で挿入してコミットします。

1つのテーブルでテストを開始したところ、挿入速度がすぐに遅くなりました。 ただし、テーブルが非メモリテーブルになった場合、挿入率は問題ありませんでした。

テーブルには90列、1トリガー、15インデックスがあります。

試験の準備と結果を以下に示します。

準備


1)テーブル、トリガー、インデックスを作成します。

2)「alter table test_table inmemory priority critical」を使用してテーブルをインメモリにします

結果


インメモリオプションなし(〜7000 recs/sec)

Avg time to read 1 record  = [0.0241493] ms
Avg time to insert 1 record  = [0.141788] ms
Avg time to insert 1 block of 500 number of rows  = [70.894] ms
Avg time to commit 2 blocks(500 rows per block)  = [3.888] ms
Total time for 2000 blocks of inserts  = [141.788] s, at [7052.78] recs/s
Total time for 1000 number of commits  = [3.888] s
Total time for 2000 blocks of inserts + 1000 number of commits  = [145.676] s
Total time to read 1000000 number of records from file  = [24.1493] s
Total time to read 1000000 number of records + 2000 blocks of inserts + 1000 number of commits  = [169.825] s

インメモリオプションあり(〜200 REC /秒)

Avg time to read 1 record  = [0.0251651] ms
Avg time to insert 1 record  = [4.62541] ms
Avg time to insert 1 block of 500 number of rows  = [2312.7] ms
Avg time to commit 2 blocks(500 rows per block)  = [3.32] ms
Total time for 200 blocks of inserts  = [462.541] s, at [216.197] recs/s
Total time for 100 number of commits  = [0.332] s
Total time for 200 blocks of inserts + 100 number of commits  = [462.873] s
Total time to read 100000 number of records from file  = [2.51651] s
Total time to read 100000 number of records + 200 blocks of inserts + 100 number of commits  = [465.39] s

DBのメモリパラメータを以下に示します。

NAME                            TYPE        VALUE

lock_sga                        boolean     FALSE
pre_page_sga                    boolean     TRUE
sga_max_size                    big integer 30G
sga_target                      big integer 30G
unified_audit_sga_queue_size    integer     1048576
inmemory_clause_default         string  
inmemory_force                  string      DEFAULT
inmemory_max_populate_servers   integer     8
inmemory_query                  string      ENABLE
inmemory_size                   big integer 10G
inmemory_trickle_repopulate_    integer     1
servers_percent     
optimizer_inmemory_aware        boolean     TRUE
buffer_pool_keep                string  
buffer_pool_recycle             string  
db_block_buffers                integer     0
log_buffer                      big integer 1048552K
use_indirect_data_buffers       boolean     FALSE
memory_max_target               big integer 0
memory_target                   big integer 0
optimizer_inmemory_aware        boolean TRUE
pga_aggregate_limit             big integer 8G
pga_aggregate_target            big integer 4G

以下も試してみましたが、結果は同じでした。

1)RAC(2ノードRAC)上の1つのインスタンスを停止します。

2)インメモリの優先度を「高」、「低」の順に変更します。

誰かが私を正しい方向に向けられることを願っています。前もって感謝します。

2

InmemoryのDMLには、Journal&Inmemory Transaction Managerなどの新機能が含まれます。インメモリが有効になっているテーブルで挿入操作があると、これらの新機能が更新され、トランザクションの一貫性が保たれます。場合によっては、インメモリ列ユニット(IMCU)のトランザクションの整合性を保つためにオーバーヘッドが発生することがあります。

以下は、パフォーマンスに影響する いくつかの要因 です。

  • 変化率
  • テーブルに選択されたメモリ内圧縮レベル
  • 変更された行の場所
  • 実行されている操作のタイプ

例:圧縮レベルが高いテーブルは、圧縮レベルが低いテーブルよりもオーバーヘッドが大きくなります。

以下は、微調整できる他のいくつかの決定要因です。

  • インメモリコーディネーター(IMCO)プロセスは2分ごとにキックインして、データをインメモリに読み込みます
  • 所定の2分のウィンドウでトリクル再入力を介して再入力されるIMCUの数は、新しい初期化パラメーターINMEMORY_TRICKLE_REPOPULATE_SERVERS_PERCENTによって制限されます
  • DML中にインデックスを更新するためのオーバーヘッド
  • RAC環境での使用中にテーブルに使用されるDISTRIBUTEまたはDUPLICATE句

したがって、これらすべての組み合わせにより、挿入のランタイムが決定されます。また、 OLTP&DWパフォーマンスの向上 を対象としたバンドルパスの更新も確認してください。

ケースのパフォーマンスを改善するには、テーブルに使用する圧縮レベルをmemcompress for dmlに変更してみてください。

alter table test_table inmemory priority critical memcompress for dml duplicate all

あなたが試した方法について:

  1. RAC(2ノードRAC)上の1つのインスタンスを停止します。

RACノードは主にinmeomoryテーブルに使用されるDUPLICATE/DISTRIBUTE句を通じてインメモリフォールトトレランスに使用されるため、1つのインスタンスを停止してもパフォーマンスには影響しません。したがって、挿入パフォーマンスの向上には役立ちません。

  1. インメモリの優先度を「高」、「低」の順に変更します。

優先度句の変更は、主にテーブルをインメモリに移入/再移入するときに使用されます。インメモリが有効なテーブルが多数ある場合、IMCOは優先度設定(CRITICAL, HIGH, MEDIUM, LOW & NONE)に基づいてテーブルを取得し、それらをインメモリ領域にロードします。したがって、テーブルの優先度を高くまたはそれ以上に維持すると、挿入後に更新されたバージョンのテーブルがすぐに表示されることが期待される場合に影響があります。このため、IMCOの期間を微調整する必要があります。

1
learningloop