クエリ結果の順序に要件がない場合は、並列スキャン機能を使用してクエリ結果を効率的に取得できます。
前提条件
OTSClient インスタンスが初期化されていること。詳細については、OTSClient インスタンスの初期化を参照してください。
データテーブルが作成され、データがデータテーブルに書き込まれていること。詳細については、データテーブルの作成およびデータの書き込みを参照してください。
データテーブルの検索インデックスが作成されていること。詳細については、検索インデックスの作成を参照してください。
パラメーター
パラメーター | 説明 | |
TableName | データテーブルの名前。 | |
IndexName | 検索インデックスの名前。 | |
ScanQuery | クエリ | 検索インデックスのクエリステートメント。用語クエリ、あいまいクエリ、範囲クエリ、地理クエリ、ネストクエリなどのクエリタイプがサポートされており、Search操作でサポートされているものと同じです。 |
Limit | 各ParallelScan呼び出しで返されることができる行の最大数。 | |
MaxParallel | リクエストごとの並列スキャンタスクの最大数。リクエストごとの並列スキャンタスクの最大数は、データ量によって異なります。データ量が多いほど、リクエストごとの並列スキャンタスクが多くなります。ComputeSplits操作を呼び出して、リクエストごとの並列スキャンタスクの最大数をクエリできます。 | |
CurrentParallelId | リクエスト内の並列スキャンタスクのID。有効な値:[0,MaxParallel)。 | |
Token | クエリ結果をページングするために使用されるトークン。ParallelScanリクエストの結果には、次のページのトークンが含まれています。トークンを使用して次のページを取得できます。 | |
AliveTime | 現在の並列スキャンタスクの有効期間。この有効期間は、トークンの有効期間でもあります。デフォルト値:60。単位:秒。デフォルト値を使用することをお勧めします。有効期間内に次のリクエストが開始されない場合、それ以上のデータはクエリできません。リクエストを送信するたびにトークンの有効時間が更新されます。 説明 スキーマでスイッチインデックスが動的に変更された場合、単一サーバーに障害が発生した場合、またはサーバーの負荷分散が実行された場合、セッションは期限前に期限切れになります。この場合、セッションを再作成する必要があります。 | |
ColumnsToGet | グループ化結果で返される列の名前。Columnsパラメーターを列名に設定できます。 検索インデックスのすべての列を返す場合は、ReturnAllFromIndexパラメーターを指定できます。 重要 ReturnAllパラメーターはサポートされていません。 | |
SessionId | 並列スキャンタスクのセッションID。ComputeSplits操作を呼び出してセッションを作成し、並列スキャンリクエストでサポートされている並列スキャンタスクの最大数をクエリできます。 |
例
次のサンプルコードは、単一スレッドを使用してデータをスキャンする方法を示しています。
/// <summary>
/// 並列スキャンを実行して、単一スレッドを使用してデータをスキャンします。
/// </summary>
public class ParallelScan
{
public static void ParallelScanwithSingleThread(OTSClient otsClient)
{
SearchIndexSplitsOptions options = new SearchIndexSplitsOptions
{
IndexName = IndexName
};
ComputeSplitsRequest computeSplitsRequest = new ComputeSplitsRequest
{
TableName = TableName,
SplitOptions = options
};
ComputeSplitsResponse computeSplitsResponse = otsClient.ComputeSplits(computeSplitsRequest);
MatchAllQuery matchAllQuery = new MatchAllQuery();
ScanQuery scanQuery = new ScanQuery();
scanQuery.AliveTime = 60;
scanQuery.Query = matchAllQuery;
scanQuery.MaxParallel = computeSplitsResponse.SplitsSize;
scanQuery.Limit = 10;
ParallelScanRequest parallelScanRequest = new ParallelScanRequest();
parallelScanRequest.TableName = TableName;
parallelScanRequest.IndexName = IndexName;
parallelScanRequest.ScanQuery = scanQuery;
parallelScanRequest.ColumnToGet = new ColumnsToGet { ReturnAllFromIndex = true };
parallelScanRequest.SessionId = computeSplitsResponse.SessionId;
int total = 0;
List<Row> result = new List<Row>();
ParallelScanResponse parallelScanResponse = otsClient.ParallelScan(parallelScanRequest);
while (parallelScanResponse.NextToken != null)
{
List<Row> rows = new List<Row>(parallelScanResponse.Rows);
total += rows.Count;
result.AddRange(rows);
parallelScanRequest.ScanQuery.Token = parallelScanResponse.NextToken;
parallelScanResponse = otsClient.ParallelScan(parallelScanRequest);
}
foreach (Row row in result)
{
Console.WriteLine(JsonConvert.SerializeObject(row));
}
Console.WriteLine("Total Row Count: {0}", total);
}
}