一括取得操作

一括取得操作では、パラレル・スキャンのように、各シャードのレコードを並列で取得および処理できます。ただし、検索条件としては1つのキーではなくキーのシーケンスを使用します。

一括取得操作では、一度にすべてがまとめて返されることはありません。かわりに、イテレータ内ののフェッチをバッチ処理し、使用可能な帯域幅を独占することなく、ネットワーク往復を最小限にします。バッチは複数のレプリケーション・ノードで並列でフェッチされます。クライアント側でより多くのスレッドを指定すると、取得のパフォーマンスが上がります(ただしプロセッサまたはネットワークのリソースが飽和状態になるまで)。

このためには、一括検索が含まれるTableAPI.tableIterator()メソッドとTableAPI.tableKeysIterator()メソッドのいずれかを使用します。これらは検索基準として1つのキーではなくキーのシーケンスを受け取ります。シーケンスはIterator<Key>値またはList<Iterator<Key>>値を使用して指定します。

これらのメソッドは、イテレータによって指定されたキーと一致する行または主キーを取得します。

注意

イテレータによって複数のキーが生成されると、複数のキーに関連するが少なくとも1回返されます。複数回返されることもあります。

キーを指定する際には次のルールに従う必要があります。

  1. 指定するすべての主キーは同じ表に属する必要があります。

  2. 入力キーは完全なシャード・キーであることが必要です。

  3. フィールドの範囲を指定する場合、部分主キーを統一する必要があります。つまり、コンポーネントの数を同じにする必要があります。また、フィールド範囲は、提供されるキーの最初の未指定フィールドであることが必要です。

これらのメソッドを使用するとき、次を指定することもできます。

たとえば、次のように設計されている製品に関する情報を格納する表があるとします。

CREATE TABLE myTable (
    itemType STRING,
    itemCategory STRING,
    itemClass STRING,
    itemColor STRING,
    itemSize STRING,
    price FLOAT,
    inventoryCount INTEGER,
    PRIMARY KEY (SHARD(itemType, itemCategory), itemClass, itemColor,
    itemSize)) 

次のようなデータを含む表:

9個のスレッドを並列で使用して、野球で使用されるすべての帽子とズボンを探す場合は、すべてのレコードを次のように検索できます。

package kvstore.basicExample;

...
import java.util.ArrayList;
import java.util.List;
import oracle.kv.Consistency;
import oracle.kv.Direction;
import oracle.kv.table.MultiRowOptions;
import oracle.kv.table.PrimaryKey;
import oracle.kv.table.Row;
import oracle.kv.table.TableAPI;
import oracle.kv.table.TableIterator;
import oracle.kv.table.TableIteratorOptions;

...

// KVStore handle creation is omitted for brevity

...

// Construct the Table Handle
TableAPI tableH = store.getTableAPI();
Table table = tableH.getTable("myTable");
      

// Use multi-threading for this store iteration and limit the number
// of threads (degree of parallelism) to 9. 
final int maxConcurrentRequests = 9;
final int batchResultsSize = 0;
final TableIteratorOptions tio =
   new TableIteratorOptions(Direction.UNORDERED,
                  Consistency.NONE_REQUIRED,
                  0, null,
                  maxConcurrentRequests,
                  batchResultsSize);
          
// Create retrieval keys     
PrimaryKey myKey = table.createPrimaryKey();
myKey.put("itemType", "Hats");
myKey.put("itemCategory", "baseball");
PrimaryKey otherKey = table.createPrimaryKey();
otherKey.put("itemType", "Pants");
otherKey.put("itemCategory", "baseball");

List<PrimaryKey> searchKeys = new ArrayList<PrimaryKey>();

// Add the retrieval keys to the list.
searchKeys.add(myKey);
searchKeys.add(otherKey);
  
     
final TableIterator<Row> iterator = tableH.tableIterator(
                                     searchKeys.iterator(), null, tio);

// Now retrieve the records.
try {
    while (iterator.hasNext()) {
    Row row = (Row) iterator.next();
    // Do some work with the Row here
    }
} finally {
   if (iterator != null) {
   iterator.close();
   }
}