Todos los productos
Search
Centro de documentos

Tablestore:Perform a parallel scan

Última actualización: Sep 03, 2026

Si no tiene requisitos sobre el orden de los resultados de la consulta, puede utilizar la función de escaneo paralelo para obtenerlos de manera eficiente.

Requisitos previos

Parámetros

Un escaneo paralelo requiere dos operaciones de coordinación: llame a ComputeSplits para obtener el ID de sesión y el número máximo de tareas paralelas (MaxParallel), y luego inicie una tarea ParallelScan por cada espacio paralelo, cada una con un CurrentParallelId único que va desde 0 hasta MaxParallel - 1. Por ejemplo, si MaxParallel es 4, inicie cuatro tareas de escaneo con valores de CurrentParallelId de 0, 1, 2 y 3 para cubrir el conjunto de datos completo.

Parámetro

Descripción

TableName

El nombre de la tabla de datos.

IndexName

El nombre del índice de búsqueda.

ScanQuery

Query

La condición de consulta. Tipos compatibles: consulta de término, consulta difusa, consulta de rango, consulta geográfica y consulta anidada; los mismos tipos que admite la operación Search.

Limit

El número máximo de filas devueltas por cada llamada a ParallelScan.

MaxParallel

El número máximo de tareas de escaneo paralelo por solicitud. El valor máximo depende del volumen de datos; los conjuntos de datos más grandes admiten más tareas paralelas. Llame a ComputeSplits para obtener este valor antes de iniciar un escaneo. Cada solicitud de ParallelScan utiliza un CurrentParallelId en el rango [0, MaxParallel), y se deben cubrir todos los ID de ese rango para escanear el conjunto de datos completo. Por ejemplo, si MaxParallel es 4, inicie cuatro tareas con valores de CurrentParallelId de 0, 1, 2 y 3. MaxParallel y CurrentParallelId deben usarse juntos.

CurrentParallelId

El ID de esta tarea de escaneo paralelo. Valores válidos: [0, MaxParallel). Cada tarea concurrente debe usar un ID único. Debe usarse junto con MaxParallel.

Token

El token de paginación para obtener la siguiente página de resultados. Cada respuesta de ParallelScan incluye un token para la siguiente página. Páselo en la solicitud posterior para continuar la lectura. Cuando el token es nulo, se han recuperado todos los datos de esta tarea.

AliveTime

El periodo de validez de la sesión y su token asociado, en segundos. Valor predeterminado: 60. Utilice el valor predeterminado. Si no se envía ninguna solicitud dentro del periodo de validez, la sesión caduca y no se pueden recuperar más datos. El periodo de validez se restablece con cada solicitud.

Nota

Las sesiones pueden caducar antes de tiempo si se modifica dinámicamente el esquema del índice de búsqueda, falla un servidor individual o se realiza un balanceo de carga del servidor. En estos casos, vuelva a crear la sesión.

ColumnsToGet

Las columnas que se devolverán. Establezca el parámetro Columns para especificar los nombres de las columnas.

Para devolver todas las columnas del índice de búsqueda, establezca ReturnAllFromIndex en true.

Importante

El parámetro ReturnAll no es compatible.

SessionId

El ID de sesión para el escaneo paralelo. Llame a ComputeSplits para crear una sesión y obtener tanto el ID de sesión como el número máximo de tareas paralelas compatibles (MaxParallel).

Ejemplo

A continuación se muestra un ejemplo que escanea todos los datos mediante un solo hilo. Llama a ComputeSplits para obtener el ID de sesión y MaxParallel, y luego recorre las páginas de resultados mediante NextToken hasta que se recuperan todas las filas.

/// <summary>
/// Scans all data in a search index using a single thread.
/// Calls ComputeSplits to get the session ID and MaxParallel,
/// then pages through results until NextToken is null.
/// </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);
    }
}