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)インメモリの優先度を「高」、「低」の順に変更します。
誰かが私を正しい方向に向けられることを願っています。前もって感謝します。
InmemoryのDMLには、Journal&Inmemory Transaction Managerなどの新機能が含まれます。インメモリが有効になっているテーブルで挿入操作があると、これらの新機能が更新され、トランザクションの一貫性が保たれます。場合によっては、インメモリ列ユニット(IMCU)のトランザクションの整合性を保つためにオーバーヘッドが発生することがあります。
以下は、パフォーマンスに影響する いくつかの要因 です。
例:圧縮レベルが高いテーブルは、圧縮レベルが低いテーブルよりもオーバーヘッドが大きくなります。
以下は、微調整できる他のいくつかの決定要因です。
したがって、これらすべての組み合わせにより、挿入のランタイムが決定されます。また、 OLTP&DWパフォーマンスの向上 を対象としたバンドルパスの更新も確認してください。
ケースのパフォーマンスを改善するには、テーブルに使用する圧縮レベルをmemcompress for dml
に変更してみてください。
alter table test_table inmemory priority critical memcompress for dml duplicate all
あなたが試した方法について:
RACノードは主にinmeomoryテーブルに使用されるDUPLICATE/DISTRIBUTE句を通じてインメモリフォールトトレランスに使用されるため、1つのインスタンスを停止してもパフォーマンスには影響しません。したがって、挿入パフォーマンスの向上には役立ちません。
優先度句の変更は、主にテーブルをインメモリに移入/再移入するときに使用されます。インメモリが有効なテーブルが多数ある場合、IMCOは優先度設定(CRITICAL, HIGH, MEDIUM, LOW & NONE
)に基づいてテーブルを取得し、それらをインメモリ領域にロードします。したがって、テーブルの優先度を高くまたはそれ以上に維持すると、挿入後に更新されたバージョンのテーブルがすぐに表示されることが期待される場合に影響があります。このため、IMCOの期間を微調整する必要があります。