パラレル・スキャン
この章では、ここまでシングルスレッドの読取りについて説明しました。読取りは、目的のレコードがすべて取得されるまで、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 */);
try {
while (iter.hasNext()) {
KeyValueVersion kvv = iter.next();
...
}
} finally {
if (iter != null) {
iter.close();
}
}