この章では、ここまでシングルスレッドの読取りについて説明しました。読取りは、目的のレコードがすべて取得されるまで、1シャードずつ順番に実行されます。これでは、複数のシャードにわたる多数のレコードを取得する場合、パフォーマンスに明らかな影響が出ます。パラレル・スキャンを使用すると、読取りのパフォーマンスを上げることができます。
次のようなキースペースがあるとします。
/trades/<timestamp>/<symbol>/-/: <price>;<qty>
10,000株を超えるORCLの全取引を検索する場合、/trades
以下のすべてのレコードを(キー接頭辞の制約などを使用して)スキャンし、各レコードを調べる必要があります。このような検索を実行するには、storeIterator()
コールを使用します。シングルスレッドのstoreIterator()
では、連続する各シャードからレコードが取得されます(つまり、シャード1の全レコードの次にシャード2の全レコード、など)。
パラレル・スキャンでは、各シャードからレコードを並行して取得するため、クライアントはそれらを並行して受け取り、処理できます。取得の実行に使用するスレッド数は指定できます。クライアント側でより多くのスレッドを指定すると、取得のパフォーマンスが上がります(ただしプロセッサまたはネットワークのリソースが飽和状態になるまで)。
パラレル・スキャンを実行するには、StoreIteratorConfig
を使用して、スキャンに使用するクライアント側のスレッドの最大数と、スキャンが一時停止するまでにOracle NoSQL Databaseクライアントが保持できる結果バッチの最大数を指定します。これをStoreIteratorConfig
に指定し、そのインスタンスを負荷がかかっているKVStore.storeIterator()
に渡して受け取らせます。これによって、パラレル・スキャンの実行に使用するParallelScanIterator
.インスタンスが作成されます。
たとえば、ストアの全レコードの取得に5スレッドを並行して使用する場合は、次のようにします。
package kvstore.basicExample; ... import oracle.kv.Consistency; import oracle.kv.Direction; import oracle.kv.ParallelScanIterator; import oracle.kv.StoreIteratorConfig; ... /* * /* * Use multi-threading for this store iteration and limit the number * of threads (degree of parallelism) to 5. */ final StoreIteratorConfig sc = new StoreIteratorConfig(). setMaxConcurrentRequests(5); ParallelScanIterator<KeyValueVersion> iter = kvstore.storeIterator (Direction.UNORDERED, 0, null /* parentKey */, null /* subRange */, null /* Depth */, Consistency.NONE, 0 /* timeout */, null /* timeoutUnit */, sc, /* New Arg: StoreIteratorConfig */); while (iter.hasNext()) { KeyValueVersion kvv = iter.next(); ... } iter.close(); ...