Todos os produtos
Search
Central de documentação

Tablestore:Executar uma varredura paralela

Última atualização: Jul 03, 2026

Se a ordem dos resultados da consulta não for relevante, use o recurso de varredura paralela para obter os dados com eficiência.

Pré-requisitos

Parâmetros

Parâmetro

Descrição

TableName

Nome da tabela de dados.

IndexName

Nome do índice de pesquisa.

ScanQuery

Query

Instrução de consulta do índice de pesquisa. Aceita tipos como term query, fuzzy query, range query, geo query e nested query, assim como a operação Search.

Limit

Número máximo de linhas retornadas por chamada ParallelScan.

MaxParallel

Número máximo de tarefas de varredura paralela por requisição. Esse valor varia conforme o volume de dados: volumes maiores exigem mais tarefas paralelas. Chame a operação ComputeSplits para consultar o limite máximo de tarefas paralelas por requisição.

CurrentParallelID

ID da tarefa de varredura paralela na requisição. Valores válidos: [0, MaxParallel).

Token

Token usado para paginar resultados da consulta. A resposta da requisição ParallelScan inclui o token da próxima página para recuperação dos dados subsequentes.

AliveTime

Período de validade da tarefa de varredura paralela atual e do token. Valor padrão: 60 segundos. Mantenha o valor padrão. Se a próxima requisição não ocorrer dentro desse período, a consulta de dados adicionais falhará. O envio de cada requisição renova a validade do token.

Nota

As sessões expiram antecipadamente se houver modificação dinâmica de índices de troca nos esquemas, falha em um único servidor ou balanceamento de carga do servidor. Nesse caso, recrie as sessões.

ColumnsToGet

Nome da coluna a retornar no resultado do agrupamento. Defina o parâmetro Columns com o nome da coluna desejada.

Para retornar todas as colunas do índice de pesquisa, especifique o parâmetro ReturnAllFromIndex.

Importante

O parâmetro ReturnAll não é suportado.

SessionId

ID da sessão da tarefa de varredura paralela. Chame a operação ComputeSplits para criar uma sessão e consultar o número máximo de tarefas de varredura paralela que a requisição suporta.

Exemplos

Conforme a necessidade do seu negócio, execute a varredura dos dados com uma única thread ou com múltiplas threads simultaneamente.

Varredura de dados com thread única

O código de requisição com thread única para varredura paralela é mais simples que o de múltiplas threads. Os parâmetros currentParallelId e maxParallel são opcionais nesse cenário. A requisição ParallelScan com thread única oferece throughput superior ao da requisição Search, mas inferior ao da ParallelScan com múltiplas threads.

func computeSplits(client *tablestore.TableStoreClient, tableName string, indexName string) (*tablestore.ComputeSplitsResponse, error) {
	req := &tablestore.ComputeSplitsRequest{}
	req.
		SetTableName(tableName).
		SetSearchIndexSplitsOptions(tablestore.SearchIndexSplitsOptions{IndexName: indexName})
	res, err := client.ComputeSplits(req)
	if err != nil {
		return nil, err
	}
	return res, nil
}

/**
 * Perform a parallel scan to scan data by using a single thread. 
 */
func ParallelScanSingleConcurrency(client *tablestore.TableStoreClient, tableName string, indexName string) {
        computeSplitsResp, err := computeSplits(client, tableName, indexName)
        if err != nil {
                fmt.Printf("%#v", err)
                return
        }

        query := search.NewScanQuery().SetQuery(&search.MatchAllQuery{}).SetLimit(2)

        req := &tablestore.ParallelScanRequest{}
        req.SetTableName(tableName).
                SetIndexName(indexName).
                SetColumnsToGet(&tablestore.ColumnsToGet{ReturnAllFromIndex: false}).
                SetScanQuery(query).
                SetSessionId(computeSplitsResp.SessionId)

        res, err := client.ParallelScan(req)
        if err != nil {
                fmt.Printf("%#v", err)
                return
        }

        total := len(res.Rows)
        for res.NextToken != nil {
                req.SetScanQuery(query.SetToken(res.NextToken))
                res, err = client.ParallelScan(req)
                if err != nil {
                        fmt.Printf("%#v", err)
                        return
                }

                total += len(res.Rows) //process rows each loop
        }
        fmt.Println("total: ", total)
}

Varredura de dados com múltiplas threads

func computeSplits(client *tablestore.TableStoreClient, tableName string, indexName string) (*tablestore.ComputeSplitsResponse, error) {
	req := &tablestore.ComputeSplitsRequest{}
	req.
		SetTableName(tableName).
		SetSearchIndexSplitsOptions(tablestore.SearchIndexSplitsOptions{IndexName: indexName})
	res, err := client.ComputeSplits(req)
	if err != nil {
		return nil, err
	}
	return res, nil
}

/**
 * Perform a parallel scan to scan data by using multiple threads. 
 */
func ParallelScanMultiConcurrency(client *tablestore.TableStoreClient, tableName string, indexName string) {
        computeSplitsResp, err := computeSplits(client, tableName, indexName)
        if err != nil {
                fmt.Printf("%#v", err)
                return
        }

        var wg sync.WaitGroup
        wg.Add(int(computeSplitsResp.SplitsSize))

        for i := int32(0); i < computeSplitsResp.SplitsSize; i++ {
                current := i
                go func() {
                        defer wg.Done()
                        query := search.NewScanQuery().
                                SetQuery(&search.MatchAllQuery{}).
                                SetCurrentParallelID(current).
                                SetMaxParallel(computeSplitsResp.SplitsSize).
                                SetLimit(2)

                        req := &tablestore.ParallelScanRequest{}
                        req.SetTableName(tableName).
                                SetIndexName(indexName).
                                SetColumnsToGet(&tablestore.ColumnsToGet{ReturnAllFromIndex: false}).
                                SetScanQuery(query).
                                SetSessionId(computeSplitsResp.SessionId)

                        res, err := client.ParallelScan(req)
                        if err != nil {
                                fmt.Printf("%#v", err)
                                return
                        }

                        total := len(res.Rows)
                        for res.NextToken != nil {
                                req.SetScanQuery(query.SetToken(res.NextToken))
                                res, err = client.ParallelScan(req)
                                if err != nil {
                                        fmt.Printf("%#v", err)
                                        return
                                }

                                total += len(res.Rows) //process rows each loop
                        }
                        fmt.Println("total: ", total)
                }()
        }
        wg.Wait()
}

Perguntas frequentes

O que fazer quando nenhum dado é encontrado ao chamar a operação Search para índices de pesquisa?

Referências