パラレル・スキャン

この章では、ここまでシングルスレッドの読取りについて説明しました。読取りは、目的のレコードがすべて取得されるまで、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();
...