この章では、ここまでシングルスレッドの読取りについて説明しました。読取りは、目的の行がすべて取得されるまで、1パーティションずつ順番に実行されます。これでは、複数のシャードにわたる多数の行を取得する場合、パフォーマンスに明らかな影響が出ます(索引または部分主キーを反復している場合などに発生する可能性があります)。パラレル・スキャンを使用すると、読取りのパフォーマンスを上げることができます。
パラレル・スキャンでは、各シャードからレコードを並行して取得するため、クライアントはそれらを並行して受け取り、処理できます。取得の実行に使用するスレッド数は指定できます。クライアント側でより多くのスレッドを指定すると、取得のパフォーマンスが上がります(ただしプロセッサまたはネットワークのリソースが飽和状態になるまで)。
パラレル・スキャンを実行するには、TableIteratorOptionsを使用して、スキャンに使用するクライアント側のスレッドの最大数と、スキャンが一時停止するまでにOracle NoSQL Databaseクライアントが保持できる要求ごとの結果の数および結果バッチの最大数を指定します。これをTableAPI.tableIterator()に渡します。これにより、指定されたパラレル・スキャン構成を使用するTableIteratorが作成されます。
たとえば、ストアの全レコードの取得に5スレッドを並行して使用する場合は、次のようにします。
package kvstore.basicExample;
...
import oracle.kv.Consistency;
import oracle.kv.Direction;
import oracle.kv.KVStore;
import oracle.kv.table.FieldRange;
import oracle.kv.table.Index;
import oracle.kv.table.IndexKey;
import oracle.kv.table.MultiRowOption;
import oracle.kv.table.Row;
import oracle.kv.table.Table;
import oracle.kv.table.TableAPI;
import oracle.kv.table.TableIterator;
import oracle.kv.table.TableIteratorOptions;
...
// KVStore handle creation is omitted for brevity
...
TableAPI tableH = kvstore.getTableAPI();
Table myTable = tableH.getTable("myTable");
// Construct the IndexKey. The name we gave our index when
// we created it was 'DoB'.
Index dobIdx = myTable.getIndex("DoB");
IndexKey dobIdxKey = dobIdx.createIndexKey();
TableIteratorOptions tio =
new TableIteratorOptions(Direction.UNORDERED,
Consistency.NONE_REQUIRED,
0, // timeout
null, // timeout units
5, // number of concurrent
// threads
0, // results per request
0); // max result sets
// Exception handling is omitted, but in production code
// ConsistencyException, RequestTimeException, and FaultException
// would have to be handled.
TableIterator<Row> iter =
tableH.tableIterator(dobIdxKey, null, tio);
while (iter.hasNext()) {
Row row = iter.next();
// Examine your row's fields here
}