一括取得操作
一括取得操作では、パラレル・スキャンのように、各シャードのレコードを並列で取得および処理できます。ただし、検索条件としては1つのキーではなくキーのセットを使用します。
一括取得操作では、一度に行すべてがまとめて返されることはありません。かわりに、イテレータ内の行のフェッチをバッチ処理し、使用可能な帯域幅を独占することなく、ネットワーク往復を最小限にします。バッチは複数のレプリケーション・ノードで並列でフェッチされます。クライアント側でより多くのスレッドを指定すると、取得のパフォーマンスが上がります(ただしプロセッサまたはネットワークのリソースが飽和状態になるまで)。
一括取得を使用するには、一括検索が含まれるTableAPI.tableIterator()
メソッドとTableAPI.tableKeysIterator()
メソッドのいずれかを使用します。これらは検索基準として1つのキーではなくキーのセットを受け取ります。このセットは、Iterator<Key>
値またはList<Iterator<Key>>
値を使用して指定します。
これらのメソッドは、イテレータによって指定されたキーと一致する行または主キーを取得します。
注意:
イテレータによって複数のキーが生成されると、複数のキーに関連する行が少なくとも1回返されます。複数回返されることもあります。
キーを指定する際には次のルールに従う必要があります。
-
指定するすべての主キーは同じ表に属する必要があります。
-
入力キーは完全なシャード・キーであることが必要です。
-
フィールドの範囲を指定する場合、部分主キーを統一する必要があります。つまり、コンポーネントの数を同じにする必要があります。また、フィールド範囲は、提供されるキーの最初の未指定フィールドであることが必要です。
これらのメソッドを使用する場合、オプションで次のものも指定できます。
-
MultiRowOptions
クラス・インスタンス。フィールド範囲の他に、イテレーションに含める祖先表と親表を指定できます。 -
TableIteratorOptions
クラス・インスタンスを使用してネットワークに往復するたびにフェッチするキー数。値0を指定すると、内部的に決められたデフォルトが使用されます。走査順序も指定できます(UNORDERED
がサポートされます)。MaxConcurrentRequests
パラメータを使用すると、ストアの読取りの実行に使用されるスレッド数を制御できます。最後に、一貫性ポリシーを指定します。詳細は、「一貫性保証」を参照してください。
たとえば、次のように設計されている製品に関する情報を格納する表があるとします。
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))
次のようなデータを含む表:
-
行1:
-
itemType: Hats
-
itemCategory: baseball
-
itemClass: longbill
-
itemColor: red
-
itemSize: small
-
price: 12.07
-
inventoryCount: 127
-
-
行2:
-
itemType: Hats
-
itemCategory: baseball
-
itemClass: longbill
-
itemColor: red
-
itemSize: medium
-
price: 13.07
-
inventoryCount: 201
-
-
行3:
-
itemType: Pants
-
itemCategory: baseball
-
itemClass: Summer
-
itemColor: red
-
itemSize: large
-
price: 14.07
-
inventoryCount: 39
-
-
行4:
-
itemType: Pants
-
itemCategory: baseball
-
itemClass: Winter
-
itemColor: white
-
itemSize: large
-
price: 16.99
-
inventoryCount: 9
-
-
行n:
-
itemType: Coats
-
itemCategory: Casual
-
itemClass: Winter
-
itemColor: red
-
itemSize: large
-
price: 247.99
-
inventoryCount: 13
-
9個のスレッドを並列で使用して、野球で使用されるすべての帽子とズボンを探す場合は、すべてのレコードを次のように検索できます。
package kvstore.basicExample;
...
import java.util.ArrayList;
import java.util.List;
import oracle.kv.Consistency;
import oracle.kv.Direction;
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();
}
}