TableAPI.tableIterator()
では、非原子的な表の反復を実行できます。索引を反復するには、このメソッドを使用します。1より大きい同時要求サイズを設定した場合、このメソッドは表のパラレル・スキャンを実行します。
TableAPI.tableIterator()
は、行のセット全体を一度に返しません。かわりに、イテレータ内の行のフェッチをバッチ処理し、使用可能な帯域幅を独占することなく、ネットワーク往復を最小限にします。また、このメソッドで返される行はソートされていません。
このメソッドでは1つの原子的操作にならないことに注意してください。取得がバッチ処理されるため、取得操作全体を行ううちに戻りセットが変更されることがあります。その結果、このメソッドを使用する場合、操作の原子性が失われます。
このメソッドでは、表内の行の未ソート走査を行えます。キーを指定しない場合、このメソッドは表のすべての行を反復します。
このメソッドを使用する場合、オプションで次のものを指定できます。
MultiRowOptions
クラス・インスタンス。このクラスにより、フィールド範囲、およびこの反復に含める先祖および親表を指定できます。
TableIteratorOptions
クラス・インスタンス。このクラスにより、各ネットワーク往復でフェッチするキーの推奨数を指定できます。値0を指定すると、内部的に決められたデフォルトが使用されます。このクラスを使用して、走査順序を指定することもできます(オプションはFORWARD
およびUNORDERED
のみです)。
このクラスにより、ストア読取りの実行に使用されるスレッド数を制御することもできます。デフォルトでは、このメソッドは表の行をシングルスレッドで取得します。ストアからの行の取得に複数のスレッドを使用するパラレル・スキャンを使用すると、パフォーマンスが上がる可能性があります。詳細は「パラレル・スキャン」を参照してください。
最後に、このクラスを使用して一貫性ポリシーを指定します。詳細は、「一貫性保証」を参照してください。
たとえば、次のように設計されている製品に関する情報を格納する表があるとします。
## Enter into table creation mode table create -name myTable ## Now add the fields add-field -type STRING -name itemType add-field -type STRING -name itemCategory add-field -type STRING -name itemClass add-field -type STRING -name itemColor add-field -type STRING -name itemSize add-field -type FLOAT -name price add-field -type INTEGER -name inventoryCount primary-key -field itemType -field itemCategory -field itemClass -field itemColor -field itemSize shard-key -field itemType -field itemCategory -field itemClass ## Exit table creation mode exit
次のようなデータを含む表:
行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: Hats |
itemCategory: baseball |
itemClass: longbill |
itemColor: red |
itemSize: large |
price: 14.07 |
inventoryCount: 39 |
行n:
itemType: Coats |
itemCategory: Casual |
itemClass: Winter |
itemColor: red |
itemSize: large |
price: 247.99 |
inventoryCount: 9 |
最も簡単な例では、次のように「Hats」に関連するすべての行を取得できます。この単純な例は、TableAPI.multiGet()
でも実行できることに注意してください。ただし、TableAPI.TableIterator
を使用すると、読取りは非原子的であり、複数のスレッドを使用するように構成できます。大量の読取りの場合、このメソッドはTableAPI.multiGet()
を使用する場合よりもパフォーマンスが向上します。
package kvstore.basicExample; ... import oracle.kv.KVStore; import oracle.kv.table.PrimaryKey; import oracle.kv.table.Row; import oracle.kv.table.Table; import oracle.kv.table.TableAPI; import oracle.kv.table.TableIterator; ... // KVStore handle creation is omitted for brevity ... TableAPI tableH = kvstore.getTableAPI(); // The name you give to getTable() must be identical // to the name that you gave the table when you created // the table using the CLI's 'table create' command. Table myTable = tableH.getTable("myTable"); // Construct the PrimaryKey. In this case, we are // using a partial primary key. PrimaryKey key = myTable.createPrimaryKey(); key.put("itemType", "Hats"); // Exception handling is omitted, but in production code // ConsistencyException, RequestTimeException, and FaultException // would have to be handled. TableIterator<Row> iter = tableH.tableIterator(key, null, null); while (iter.hasNext()) { Row row = iter.next(); // Examine your row's fields here }