すべてのプロダクト
Search
ドキュメントセンター

Tablestore:パラレル スキャン

最終更新日:Dec 28, 2024

クエリ結果の順序に要件がない場合は、パラレル スキャン機能を使用してクエリ結果を効率的に取得できます。

前提条件

パラメーター

パラメーター

説明

tableName

データテーブルの名前。

indexName

検索インデックスの名前。

scanQuery

query

検索インデックスのクエリステートメント。この操作は、Search 操作と同様に、タームクエリ、あいまいクエリ、範囲クエリ、地理クエリ、およびネストされたクエリをサポートします。

limit

各 ParallelScan 呼び出しで返されることができる行の最大数。

maxParallel

リクエストごとのパラレル スキャンタスクの最大数。リクエストごとのパラレル スキャンタスクの最大数は、データ量によって異なります。データ量が多いほど、リクエストごとのパラレル スキャンタスクが多くなります。ComputeSplits 操作を使用して、リクエストごとのパラレル スキャンタスクの最大数をクエリできます。

currentParallelId

リクエスト内のパラレル スキャンタスクの ID。有効な値: [0, maxParallel の値)

token

クエリ結果をページ分割するために使用されるトークン。ParallelScan リクエストの結果には、次のページのトークンが含まれています。トークンを使用して次のページを取得できます。

aliveTime

現在のパラレル スキャンタスクの有効期間。この有効期間は、トークンの有効期間でもあります。単位: 秒。デフォルト値: 60。単位: 秒。デフォルト値を使用することをお勧めします。有効期間内に次のリクエストが開始されない場合、それ以上のデータはクエリできません。リクエストを送信するたびにトークンの有効時間が更新されます。

説明

スキーマでスイッチインデックスが動的に変更された場合、単一サーバーに障害が発生した場合、またはサーバーエンドの負荷分散が実行された場合、セッションは期限前に期限切れになります。この場合、セッションを再作成する必要があります。

columnsToGet

グループ化結果で返される列の名前。列名を Columns に追加できます。

検索インデックス内のすべての列を返す場合は、より簡潔な ReturnAllFromIndex 操作を使用できます。

重要

ReturnAll はここでは使用できません。

sessionId

パラレル スキャンタスクのセッション ID。ComputeSplits 操作を呼び出してセッションを作成し、パラレル スキャンリクエストでサポートされているパラレル スキャンタスクの最大数をクエリできます。

次のサンプルコードは、パラレル スキャンを実行する方法の例を示しています。

// 1. セッションIDを取得します。
let computeSplits = await new Promise((resolve, reject) => {
    client.computeSplits({
        tableName: tableName,
        searchIndexSplitsOptions: {
            indexName: indexName,
        }
    }, function (err, data) {
        if (err) {
            console.log('computeSplits エラー:', err.toString());
            reject(err);
        } else {
            console.log('computeSplits 成功:', data);
            resolve(data)
        }
    })
})

// 2. クエリ条件を指定します。
const scanQuery = {
    query: {
        queryType: TableStore.QueryType.MATCH_ALL_QUERY,
    },
    limit: 1000,
    aliveTime: 30,
    token: undefined,
    currentParallelId: 0,
    maxParallel: 1,
}

// 3. ParallelScan リクエストを作成します。この例では、同期リクエストが作成されます。ビジネス要件に基づいて非同期リクエストを作成できます。
const parallelScanPromise = function () {
    return new Promise(function (resolve, reject) {
        client.parallelScan({
            tableName: tableName,
            indexName: indexName,
            columnToGet: {
                returnType: TableStore.ColumnReturnType.RETURN_ALL_FROM_INDEX,
            },
            sessionId: computeSplits.sessionId,
            scanQuery: scanQuery,
        }, function (err, data) {
            if (err) {
                console.log('parallelScan エラー:', err.toString());
                reject(err);
            } else {
                console.log("parallelScan, 行数:", data.rows.length)
                resolve(data)
            }
        });
    })
}
let totalCount = 0 // クエリ条件を満たす行の総数が返されるように指定します。
let parallelScanResponse = await parallelScanPromise()
totalCount = totalCount + parallelScanResponse.rows.length
// 4. すべてのデータがプルされるまで、イテレータを使用してデータをプルします。
while (parallelScanResponse.nextToken !== null && parallelScanResponse.nextToken.length > 0) {
    scanQuery.token = parallelScanResponse.nextToken
    parallelScanResponse = await parallelScanPromise()
    totalCount += parallelScanResponse.rows.length
}
console.log("合計行数:", totalCount)

FAQ

Search 操作を呼び出してもデータが見つからない場合はどうすればよいですか?

参考資料