全部产品
Search
文档中心

Tablestore:Lakukan pemindaian paralel

更新时间:Jul 06, 2025

Jika Anda tidak memiliki persyaratan terkait urutan hasil kueri, Anda dapat menggunakan fitur pemindaian paralel untuk mendapatkan hasil kueri secara efisien.

Prasyarat

Parameter

Parameter

Deskripsi

NamaTabel

Nama dari tabel data.

NamaIndeks

Nama dari indeks pencarian.

KueriPemindaian

Kueri

Pernyataan kueri untuk indeks pencarian. Jenis kueri seperti kueri tepat, kueri kabur, kueri rentang, kueri geo, dan kueri bersarang didukung, sama seperti yang didukung oleh operasi Pencarian.

Batas

Jumlah maksimum baris yang dapat dikembalikan oleh setiap panggilan ParallelScan.

MaksParalel

Jumlah maksimum tugas pemindaian paralel per permintaan. Jumlah maksimum tugas pemindaian paralel per permintaan bervariasi berdasarkan volume data. Volume data yang lebih besar memerlukan lebih banyak tugas pemindaian paralel per permintaan. Anda dapat memanggil operasi ComputeSplits untuk menanyakan jumlah maksimum tugas pemindaian paralel per permintaan.

IDParalelSaatIni

ID dari tugas pemindaian paralel dalam permintaan. Nilai valid: [0,MaksParalel).

Token

Token yang digunakan untuk mengatur halaman hasil kueri. Hasil dari permintaan ParallelScan berisi token untuk halaman berikutnya. Anda dapat menggunakan token ini untuk mengambil halaman berikutnya.

WaktuAktif

Periode validitas dari tugas pemindaian paralel saat ini. Periode validitas ini juga merupakan periode validitas dari token. Nilai default: 60. Satuan: detik. Kami merekomendasikan Anda menggunakan nilai default. Jika permintaan berikutnya tidak dilakukan dalam periode validitas, tidak ada lagi data yang bisa di-query. Waktu validitas token diperbarui setiap kali Anda mengirimkan permintaan.

Catatan

Sesi kadaluarsa lebih awal jika indeks dinamis dimodifikasi dalam skema, server tunggal gagal, atau penyeimbangan beban server dilakukan. Dalam kasus ini, Anda harus membuat ulang sesi.

KolomUntukDiambil

Nama kolom yang akan dikembalikan dalam hasil pengelompokan. Anda dapat menetapkan parameter Kolom ke nama kolom.

Jika Anda ingin mengembalikan semua kolom dalam indeks pencarian, Anda dapat menentukan parameter ReturnAllFromIndex.

Penting

Parameter ReturnAll tidak didukung.

IDSesi

ID sesi dari tugas pemindaian paralel. Anda dapat memanggil operasi ComputeSplits untuk membuat sesi dan menanyakan jumlah maksimum tugas pemindaian paralel yang didukung oleh permintaan pemindaian paralel.

Contoh

Anda dapat memindai data menggunakan satu utas atau beberapa utas sekaligus sesuai dengan kebutuhan bisnis Anda.

Pemindaian data menggunakan satu utas

Ketika menggunakan fitur pemindaian paralel, kode untuk permintaan yang menggunakan satu utas lebih sederhana daripada kode untuk permintaan yang menggunakan beberapa utas. Parameter currentParallelId dan maxParallel tidak diperlukan untuk permintaan yang menggunakan satu utas. Permintaan ParallelScan yang menggunakan satu utas memberikan throughput lebih tinggi dibandingkan permintaan Search, tetapi lebih rendah dibandingkan permintaan ParallelScan yang menggunakan beberapa utas.

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
}

/**
 * Lakukan pemindaian paralel untuk memindai data menggunakan satu utas.
 */
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) //proses baris setiap loop
        }
        fmt.Println("total: ", total)
}

Pemindaian data menggunakan beberapa utas

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
}

/**
 * Lakukan pemindaian paralel untuk memindai data menggunakan beberapa utas.
 */
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) //proses baris setiap loop
                        }
                        fmt.Println("total: ", total)
                }()
        }
        wg.Wait()
}

FAQ

Apa yang harus saya lakukan jika tidak ada data yang ditemukan ketika saya memanggil operasi Search untuk indeks pencarian?

Referensi

  • Saat menggunakan indeks pencarian untuk menanyakan data, Anda dapat menggunakan metode kueri berikut: kueri tepat, kueri terms, kueri match all, kueri match, kueri match phrase, kueri prefix, kueri rentang, kueri wildcard, kueri geo, kueri Boolean, kueri vektor KNN, kueri nested, dan kueri exists. Anda dapat menggunakan metode kueri yang disediakan oleh indeks pencarian untuk menanyakan data dari berbagai dimensi sesuai kebutuhan bisnis Anda.

    Anda dapat mengurutkan atau membagi halaman baris yang memenuhi kondisi kueri dengan menggunakan fitur Pengurutan dan paging. Untuk informasi lebih lanjut, lihat Pengurutan dan Paging.

    Anda dapat menggunakan fitur collapse (distinct) untuk meruntuhkan set hasil berdasarkan kolom tertentu. Dengan cara ini, data dari jenis tertentu hanya muncul sekali dalam hasil kueri. Untuk informasi lebih lanjut, lihat Collapse (Distinct).

  • Jika Anda ingin menganalisis data dalam tabel data, Anda dapat menggunakan fitur agregasi dari operasi Search atau menjalankan pernyataan SQL. Misalnya, Anda dapat memperoleh nilai minimum dan maksimum, jumlah, serta total baris. Untuk informasi lebih lanjut, lihat Agregasi dan Kueri SQL.

  • Jika Anda ingin mendapatkan semua baris yang memenuhi kondisi kueri tanpa perlu mengurutkan baris, Anda dapat memanggil operasi ParallelScan dan ComputeSplits untuk menggunakan fitur pemindaian paralel. Untuk informasi lebih lanjut, lihat Lakukan Pemindaian Paralel.