All Products
Search
Document Center

MaxCompute:Tabel Append - Hash Cluster (Hanya Berdasarkan Undangan)

Last Updated:Sep 02, 2026

MaxCompute meningkatkan format Tabel Delta Append dengan dukungan Hash Cluster, yang meningkatkan performa kueri sekaligus memungkinkan pemrosesan data inkremental. Artikel ini mencakup perbedaan dari jenis tabel lainnya, detail sintaksis, serta contoh penggunaan untuk SQL dan SDK Data Tunnel.

Kasus Penggunaan

Hash Cluster direkomendasikan untuk skenario berikut:

  • Kueri filter kesamaan: Gunakan untuk pencarian titik (point lookups) atau filter kesamaan pada kolom tertentu guna mengurangi pemindaian data.

  • Operasi equi-join dan GROUP BY: Kurangi pengacakan data saat melakukan join atau agregasi beberapa tabel berdasarkan kunci yang sama.

Perbandingan dengan jenis tabel serupa

Jenis Tabel

Metode Pengelompokan

Penulisan Inkremental (ACID)

Tabel Terkelompok Hash

Hash

Tidak didukung

Menyediakan optimasi Pengelompokan Hash (Shuffle + Sort) tetapi tidak mendukung ACID.

Tabel Delta PK

Hash

Didukung

Menawarkan kemampuan ACID dan optimasi Pengelompokan Hash. Cocok untuk data dengan primary key. Performa baca dan tulis lebih rendah dibandingkan tabel tanpa primary key.

Tabel Delta Append - Range Cluster

Range

Didukung

Menawarkan kemampuan ACID dan mendukung recluster, tetapi metode pengelompokan Range-nya menghasilkan performa tulis lebih rendah dibandingkan Hash.

Tabel Delta Append - Hash Cluster

Hash

Didukung

Menggabungkan optimasi Pengelompokan Hash (Shuffle + Sort) dengan kemampuan ACID penuh. Fitur ini juga mendukung recluster inkremental maupun penuh di latar belakang, menjadikannya opsi paling lengkap.

Prasyarat

Sebelum membuat tabel, aktifkan parameter sesi berikut:

SET odps.table.append2.enable=true;
SET odps.table.hash.delta.enable=true; -- Mengaktifkan fitur percobaan untuk membuat tabel delta hash.

Sintaksis

CREATE TABLE [IF NOT EXISTS] <table_name>
             [(<col_name> <data_type> [comment <col_comment>], ...)]
             [PARTITIONED BY (<col_name> <data_type> [comment <col_comment>], ...)]
             CLUSTERED BY (<col_name> [, <col_name>, ...])
             [SORTED BY (<col_name> [, <col_name>, ...])] -- Hanya urutan ascending yang didukung.
             INTO <number_of_buckets> BUCKETS
             TBLPROPERTIES ('table.format.version' = '2'); 

Parameter

Parameter

Deskripsi

CLUSTERED BY

Menentukan kolom bucketing. Pilih kolom yang sering digunakan dalam kueri filter kesamaan, equi-join, GROUP BY, atau klausa WINDOW PARTITION BY . Untuk hasil terbaik, pilih kolom dengan kardinalitas tinggi agar distribusi data merata di seluruh bucket.

SORTED BY

Opsional. Menentukan kolom pengurutan dalam setiap bucket. Saat ini hanya urutan ascending yang didukung. Disarankan memilih kolom yang digunakan untuk filter range atau kesamaan, perhitungan window, atau timestamp versi.

INTO ... BUCKETS

Menentukan jumlah bucket logis. Disarankan menetapkan angka ini berdasarkan volume data, konkurensi kueri, dan kardinalitas kolom bucketing Anda. Jumlah bucket memengaruhi paralelisme operasi tulis dan optimasi shuffle selama operasi baca.

table.format.version

Atur ke 2 untuk membuat tabel dengan format data yang diperlukan untuk Hash Cluster.

Contoh SQL

Contoh ini menggunakan tabel status produk dan versi harga. Dalam logika bisnis, pencarian titik atau join biasanya dilakukan pada produk berdasarkan item_id. Oleh karena itu, item_id ditetapkan sebagai kolom bucketing hash. Waktu efektif versi, event_time, digunakan untuk melacak perubahan historis, sehingga event_time ditetapkan sebagai kolom pengurutan. Desain ini cocok untuk skenario seperti tabel Slowly Changing Dimension (SCD), tabel versi harga produk, dan tabel detail perubahan status.

Persiapan

SET odps.sql.type.system.odps2=true;
SET odps.table.append2.enable=true;
SET odps.table.hash.delta.enable=true;

Buat tabel

Tabel non-partisi

CREATE TABLE hash_delta_sales_demo (
  item_id BIGINT,
  event_time TIMESTAMP,
  price DOUBLE,
  status STRING
)
CLUSTERED BY (item_id)
SORTED BY (event_time)
INTO 256 BUCKETS 
TBLPROPERTIES ('table.format.version' = '2');

Tabel partisi

Jika Anda perlu mengelola data berdasarkan tanggal, Anda juga dapat membuat tabel partisi:

CREATE TABLE hash_delta_sales_demo_pt (
  item_id BIGINT,
  event_time TIMESTAMP,
  price DOUBLE,
  status STRING
)
PARTITIONED BY (ds STRING)
CLUSTERED BY (item_id)
SORTED BY (event_time)
INTO 256 BUCKETS
TBLPROPERTIES ('table.format.version' = '2');

Jalankan DESC EXTENDED hash_delta_sales_demo; untuk melihat informasi tabel. Definisi bucketing dan pengurutan tabel adalah sebagai berikut:

ClusterType:              hash
BucketNum:                256
ClusterColumns:           [item_id]
SortColumns:              [event_time ASC]

Penulisan inkremental

Contoh berikut menggunakan tabel non-partisi untuk menunjukkan penulisan inkremental dan recluster.

  • Penulisan data awal

    INSERT INTO TABLE hash_delta_sales_demo VALUES
      (1001, TIMESTAMP '2026-05-01 10:00:00', 10.00, 'active'),
      (1001, TIMESTAMP '2026-05-03 10:00:00', 13.00, 'active'),
      (1002, TIMESTAMP '2026-05-01 11:00:00', 20.00, 'active');
    
    DESC EXTENDED hash_delta_sales_demo;

    Contoh hasil eksekusi

    Field utama:

    • DataPhysicalClustered: true — Data secara fisik dibucket berdasarkan item_id.

    • DataFullySorted: true — Data dalam bucket sepenuhnya diurutkan berdasarkan event_time.

    +------------------------------------------------------------------------------------+
    | Owner:                    ALIYUN$***_com                                           |
    | Project:                  test                                                     |
    | TableComment:                                                                      |
    +------------------------------------------------------------------------------------+
    | CreateTime:               2026-07-08 16:38:34                                      |
    | LastDDLTime:              2026-07-08 16:38:34                                      |
    | LastModifiedTime:         2026-07-08 16:39:38                                      |
    +------------------------------------------------------------------------------------+
    | InternalTable: YES      | Size: 4823                                               |
    +------------------------------------------------------------------------------------+
    | Native Columns:                                                                    |
    +------------------------------------------------------------------------------------+
    | Field    | Type   | Label | ExtendedLabel | Nullable | DefaultValue | Comment      |
    +------------------------------------------------------------------------------------+
    | item_id  | bigint |       |               | true     | NULL         |              |
    | event_time | timestamp |  |               | true     | NULL         |              |
    | price    | double |       |               | true     | NULL         |              |
    | status   | string |       |               | true     | NULL         |              |
    +------------------------------------------------------------------------------------+
    | Extended Info:                                                                     |
    +------------------------------------------------------------------------------------+
    | TableID:                  65**8e                                                   |
    | IsArchived:               false                                                    |
    | PhysicalSize:             14469                                                    |
    | FileNum:                  5                                                        |
    | ColdStorageStatus:        N/A                                                      |
    | CompressionStrategy:      normal                                                   |
    | DataFullySorted:          true                                                     |
    | DataPhysicalClustered:    true                                                     |
    | IsolationMin:             NONSTRICT_SNAPSHOT_ISOLATION                             |
    | OverlapDepth:             2                                                        |
    | OverlapRatio:             1.000000                                                 |
    | StoredAs:                 AliOrc                                                   |
    | Transactional:            true                                                     |
    | encryption_enable:        false                                                    |
    | odps.timemachine.retention.days: 1                                                        |
    | ClusterType:              hash                                                     |
    | BucketNum:                256                                                      |
    | ClusterColumns:           [item_id]                                                |
    | SortColumns:              [event_time ASC]                                         |
    | StorageTier:              Standard                                                 |
    | StorageTierLastModifiedTime:  2026-07-08 16:39:38                                  |
    +------------------------------------------------------------------------------------+
  • Operasi Delete

    Periksa status tabel setelah menghapus beberapa data:

    DELETE FROM hash_delta_sales_demo WHERE item_id = 1002;
    
    DESC EXTENDED hash_delta_sales_demo;

    Contoh hasil eksekusi

    Field utama:

    • DataPhysicalClustered: true — Data secara fisik dikelompokkan berdasarkan item_id.

    • DataFullySorted: true — Operasi delete tidak mengganggu urutan pengurutan data yang ada.

    +------------------------------------------------------------------------------------+
    | Owner:                    ALIYUN$***_com                                           |
    | Project:                  test                                                     |
    | TableComment:                                                                      |
    +------------------------------------------------------------------------------------+
    | CreateTime:               2026-07-08 16:38:34                                      |
    | LastDDLTime:              2026-07-08 16:38:34                                      |
    | LastModifiedTime:         2026-07-08 16:41:02                                      |
    | LastAccessTime:           2026-07-08 16:40:57                                      |
    +------------------------------------------------------------------------------------+
    | InternalTable: YES      | Size: 7082                                               |
    +------------------------------------------------------------------------------------+
    | Native Columns:                                                                    |
    +------------------------------------------------------------------------------------+
    | Field    | Type   | Label | ExtendedLabel | Nullable | DefaultValue | Comment      |
    +------------------------------------------------------------------------------------+
    | item_id  | bigint |       |               | true     | NULL         |              |
    | event_time | timestamp |  |               | true     | NULL         |              |
    | price    | double |       |               | true     | NULL         |              |
    | status   | string |       |               | true     | NULL         |              |
    +------------------------------------------------------------------------------------+
    | Extended Info:                                                                     |
    +------------------------------------------------------------------------------------+
    | TableID:                  65**8e                                                   |
    | IsArchived:               false                                                    |
    | PhysicalSize:             21246                                                    |
    | FileNum:                  10                                                       |
    | ColdStorageStatus:        N/A                                                      |
    | CompressionStrategy:      normal                                                   |
    | DataFullySorted:          true                                                     |
    | DataPhysicalClustered:    true                                                     |
    | IsolationMin:             NONSTRICT_SNAPSHOT_ISOLATION                             |
    | OverlapDepth:             2                                                        |
    | OverlapRatio:             1.000000                                                 |
    | StoredAs:                 AliOrc                                                   |
    | Transactional:            true                                                     |
    | encryption_enable:        false                                                    |
    | odps.timemachine.retention.days: 1                                                        |
    | ClusterType:              hash                                                     |
    | BucketNum:                256                                                      |
    | ClusterColumns:           [item_id]                                                |
    | SortColumns:              [event_time ASC]                                         |
    | StorageTier:              Standard                                                 |
    | StorageTierLastModifiedTime:  2026-07-08 16:41:02                                  |
    +------------------------------------------------------------------------------------+
    
  • Mengisi ulang data historis

    Mengisi ulang versi historis. Nilai event_time versi ini berada di antara timestamp yang sudah ada untuk item_id=1001:

    INSERT INTO TABLE hash_delta_sales_demo VALUES
      (1001, TIMESTAMP '2026-05-02 09:00:00', 12.00, 'active');
    
    DESC EXTENDED hash_delta_sales_demo;

    Contoh hasil eksekusi

    Field utama:

    • DataPhysicalClustered: true — Data secara fisik dikelompokkan berdasarkan item_id.

    • DataFullySorted: false — Data dalam bucket tidak lagi sepenuhnya diurutkan karena file baru telah ditambahkan.

    +------------------------------------------------------------------------------------+
    | Owner:                    ALIYUN$***_com                                           |
    | Project:                  test                                                     |
    | TableComment:                                                                      |
    +------------------------------------------------------------------------------------+
    | CreateTime:               2026-07-08 16:38:34                                      |
    | LastDDLTime:              2026-07-08 16:38:34                                      |
    | LastModifiedTime:         2026-07-08 16:42:54                                      |
    | LastAccessTime:           2026-07-08 16:40:57                                      |
    +------------------------------------------------------------------------------------+
    | InternalTable: YES      | Size: 10705                                              |
    +------------------------------------------------------------------------------------+
    | Native Columns:                                                                    |
    +------------------------------------------------------------------------------------+
    | Field    | Type   | Label | ExtendedLabel | Nullable | DefaultValue | Comment      |
    +------------------------------------------------------------------------------------+
    | item_id  | bigint |       |               | true     | NULL         |              |
    | event_time | timestamp |       |               | true     | NULL         |              |
    | price    | double |       |               | true     | NULL         |              |
    | status   | string |       |               | true     | NULL         |              |
    +------------------------------------------------------------------------------------+
    | Extended Info:                                                                     |
    +------------------------------------------------------------------------------------+
    | TableID:                  65**8e                                                   |
    | IsArchived:               false                                                    |
    | PhysicalSize:             32115                                                    |
    | FileNum:                  13                                                       |
    | ColdStorageStatus:        N/A                                                      |
    | CompressionStrategy:      normal                                                   |
    | DataFullySorted:          false                                                    |
    | DataPhysicalClustered:    true                                                     |
    | IsolationMin:             NONSTRICT_SNAPSHOT_ISOLATION                             |
    | OverlapDepth:             2                                                        |
    | OverlapRatio:             1.000000                                                 |
    | StoredAs:                 AliOrc                                                   |
    | Transactional:            true                                                     |
    | encryption_enable:        false                                                    |
    | odps.timemachine.retention.days: 1                                                        |
    | ClusterType:              hash                                                     |
    | BucketNum:                256                                                      |
    | ClusterColumns:           [item_id]                                                |
    | SortColumns:              [event_time ASC]                                         |
    | StorageTier:              Standard                                                 |
    | StorageTierLastModifiedTime:  2026-07-08 16:42:54                                  |
    +------------------------------------------------------------------------------------+
    
    

Pemangkasan Bucket

Saat Anda menjalankan kueri filter kesamaan pada kolom bucketing, MaxCompute menggunakan distribusi hash untuk langsung menemukan bucket target, sehingga menghindari pemindaian semua bucket lainnya. Kueri berikut menyaring berdasarkan item_id = 1001 dan hanya membaca bucket logis yang berisi nilai tersebut, menghindari pemindaian tabel penuh:

SELECT * FROM hash_delta_sales_demo
  WHERE item_id = 1001
  ORDER BY event_time
  LIMIT 10;

-- Returns:
+------------+---------------------+------------+--------+
| item_id    | event_time          | price      | status |
+------------+---------------------+------------+--------+
| 1001       | 2026-05-01 10:00:00 | 10.0       | active |
| 1001       | 2026-05-02 09:00:00 | 12.0       | active |
| 1001       | 2026-05-03 10:00:00 | 13.0       | active |
+------------+---------------------+------------+--------+

Recluster penuh

Jika Anda perlu mengatur ulang data yang sudah ada, jalankan RECLUSTER FULL. Operasi ini mempertahankan semantik data historis dalam tabel dan mengatur ulang data yang tersimpan sesuai definisi tabel saat ini.

ALTER TABLE hash_delta_sales_demo RECLUSTER FULL;

DESC EXTENDED hash_delta_sales_demo;

Contoh hasil eksekusi

Field utama:

  • DataPhysicalClustered: true -- Data secara fisik dibucket berdasarkan item_id.

  • DataFullySorted: true — Semua data dalam bucket diurutkan.

+------------------------------------------------------------------------------------+
| Owner:                    ALIYUN$***_com                                           |
| Project:                  test                                                     |
| TableComment:                                                                      |
+------------------------------------------------------------------------------------+
| CreateTime:               2026-07-08 16:38:34                                      |
| LastDDLTime:              2026-07-08 16:38:34                                      |
| LastModifiedTime:         2026-07-08 16:42:54                                      |
| LastAccessTime:           2026-07-08 16:40:57                                      |
+------------------------------------------------------------------------------------+
| InternalTable: YES      | Size: 20218                                              |
+------------------------------------------------------------------------------------+
| Native Columns:                                                                    |
+------------------------------------------------------------------------------------+
| Field    | Type   | Label | ExtendedLabel | Nullable | DefaultValue | Comment      |
+------------------------------------------------------------------------------------+
| item_id  | bigint |       |               | true     | NULL         |              |
| event_time | timestamp |       |               | true     | NULL         |              |
| price    | double |       |               | true     | NULL         |              |
| status   | string |       |               | true     | NULL         |              |
+------------------------------------------------------------------------------------+
| Extended Info:                                                                     |
+------------------------------------------------------------------------------------+
| TableID:                  65**8e                                                   |
| IsArchived:               false                                                    |
| PhysicalSize:             60654                                                    |
| FileNum:                  20                                                       |
| ColdStorageStatus:        N/A                                                      |
| CompressionStrategy:      normal                                                   |
| DataFullySorted:          true                                                     |
| DataPhysicalClustered:    true                                                     |
| IsolationMin:             NONSTRICT_SNAPSHOT_ISOLATION                             |
| OverlapDepth:             2                                                        |
| OverlapRatio:             1.000000                                                 |
| StoredAs:                 AliOrc                                                   |
| Transactional:            true                                                     |
| encryption_enable:        false                                                    |
| odps.timemachine.retention.days: 1                                                        |
| ClusterType:              hash                                                     |
| BucketNum:                256                                                      |
| ClusterColumns:           [item_id]                                                |
| SortColumns:              [event_time ASC]                                         |
| StorageTier:              Standard                                                 |
| StorageTierLastModifiedTime:  2026-07-08 16:42:54                                  |
+------------------------------------------------------------------------------------+

Tabel Delta Append dengan Hash Cluster mendukung operasi penulisan inkremental seperti INSERT, UPDATE, DELETE, dan MERGE INTO, sekaligus mempertahankan distribusi hash. Pengoptimal memilih rencana eksekusi berdasarkan kondisi data saat ini. Pengoptimal memanfaatkan penyimpanan terurut saat data tersusun rapi, dan kembali menggunakan bucketing hash saat data tidak sepenuhnya terurut. Anda dapat menjalankan RECLUSTER FULL kapan saja untuk mengembalikan urutan pengurutan penuh.

Contoh SDK Data Tunnel

Bagian ini menunjukkan cara menggunakan SDK Data Tunnel untuk mengunggah dan mengunduh data dari tabel hash_delta_sales_demo.

  1. Impor dependensi SDK

    Gunakan versi 0.59 atau yang lebih baru. Untuk detailnya, lihat Catatan Rilis.

  2. Kode contoh

    Kode contoh

    /**
     * Contoh ini menunjukkan cara mengunggah dan mengunduh data dari tabel hash_delta_sales_demo
     * menggunakan MaxStorageClient.
     *
     * Skema Tabel:
     * CREATE TABLE hash_delta_sales_demo (
     *   item_id BIGINT,
     *   event_time TIMESTAMP,
     *   price DOUBLE,
     *   status STRING
     * );
     */
    public class MaxStorageClientExample {
    
        private static final String ENDPOINT = "<your-endpoint>";
        private static final String TUNNEL_ENDPOINT = "<your-tunnel-endpoint>";
        private static final String PROJECT = "<your-project>";
        private static final String ACCESS_ID = "<your-access-id>";
        private static final String ACCESS_KEY = "<your-access-key>";
        private static final String TABLE_NAME = "hash_delta_sales_demo";
    
    
        public static void main(String[] args) throws Exception {
            RootAllocator allocator = new RootAllocator(Long.MAX_VALUE);
    
            // 1. Bangun MaxStorageClient.
            MaxStorageClient client = MaxStorageClient.builder()
                    .endpoint(ENDPOINT)
                    .tunnelEndpoint(TUNNEL_ENDPOINT)
                    .credentialsProvider(
                            new StaticCredentialProvider(new AliyunAccount(ACCESS_ID, ACCESS_KEY).getCredentials()))
                    .project(PROJECT)
                    .bufferAllocator(allocator)
                    .build();
    
            try {
                // 2. Unggah data.
                uploadData(client);
                Thread.sleep(5000);
    
                // 3. Unduh data.
                downloadData(client);
            } finally {
                client.close();
                allocator.close();
            }
        }
    
        /**
         * Unggah data ke tabel hash_delta_sales_demo.
         */
        private static void uploadData(MaxStorageClient client) throws Exception {
            TableIdentifier tableId = TableIdentifier.of(PROJECT, TABLE_NAME);
    
            // Buat sesi tulis. withOverwrite(true) menunjukkan bahwa tabel akan ditimpa.
            TableWriteSession writeSession = client
                    .createTableWriteSessionBuilder(tableId)
                    .withOverwrite(true)
                    .build();
    
            System.out.println("Sesi tulis dibuat: " + writeSession.getId());
    
            // Gunakan RecordWriter untuk menulis data (API tingkat tinggi untuk penulisan berbasis baris).
            try (RecordWriter writer = writeSession.createWriterBuilder("stream-1", 1)
                    .build()
                    .getAsRecordWriter(1024)) {
    
                for (int i = 0; i < 1000; i++) {
                    Record record = writer.newRecord(false);
                    record.set(0, (long) i);                                    // item_id: BIGINT
                    record.set(1, LocalDateTime.of(2025, 5, 18, 10, 30, i % 60).atZone(ZoneId.systemDefault())
                            .toInstant()); // event_time: TIMESTAMP
                    record.set(2, 99.9 + i * 0.1);                             // price: DOUBLE
                    record.set(3, i % 2 == 0 ? "paid" : "pending");            // status: STRING
                    writer.write(record);
                }
            }
    
            // Commit sesi agar data terlihat.
            writeSession.commit();
            System.out.println("Berhasil mengunggah 1000 catatan ke " + TABLE_NAME);
        }
    
        /**
         * Unduh data dari tabel hash_delta_sales_demo.
         */
        private static void downloadData(MaxStorageClient client) throws Exception {
            TableIdentifier tableId = TableIdentifier.of(PROJECT, TABLE_NAME);
    
            // Buat sesi baca. Anda dapat memilih kolom tertentu dan menerapkan filter.
            TableReadSession readSession = client.createTableReadSessionBuilder(tableId)
                    .withColumns(Arrays.asList("item_id", "event_time", "price", "status"))
                    .withSplitOptions(SplitOptions.newBuilder()
                            .withSplitMode(SplitMode.ROW_OFFSET)
                            .build())
                    .build();
    
            System.out.println("Sesi baca dibuat: " + readSession.getId());
    
            // Dapatkan input split.
            List<InputSplit> splits = readSession.getSplits();
            System.out.println("Total split: " + splits.size());
    
            int totalRecords = 0;
    
            // Iterasi setiap split untuk membaca data.
            for (InputSplit split : splits) {
                try (ArrowReader reader = readSession.createReaderBuilder(split).build()) {
                    Schema schema = reader.getSchema();
                    System.out.println("Skema: " + schema);
    
                    while (reader.nextBatch()) {
                        VectorSchemaRoot root = reader.getCurrentValue();
                        int rowCount = root.getRowCount();
                        totalRecords += rowCount;
    
                        // Cetak 5 baris pertama sebagai contoh.
                        int printCount = Math.min(rowCount, 5);
                        for (int i = 0; i < printCount; i++) {
                            System.out.printf("  item_id=%s, event_time=%s, price=%s, status=%s%n",
                                    root.getVector("item_id").getObject(i),
                                    root.getVector("event_time").getObject(i),
                                    root.getVector("price").getObject(i),
                                    root.getVector("status").getObject(i));
                        }
                        if (rowCount > 5) {
                            System.out.println("  ... (" + (rowCount - 5) + " baris lagi dalam batch ini)");
                        }
                    }
                }
            }
    
            System.out.println("Total catatan yang diunduh: " + totalRecords);
        }
    }

FAQ

Memilih ukuran penyimpanan bucket

Ukuran penyimpanan yang direkomendasikan untuk satu bucket berkisar antara beberapa ratus megabyte hingga puluhan gigabyte.

  • Bucket kecil meningkatkan overhead penyimpanan dan biaya pengacakan.

  • Bucket besar memperpanjang waktu penulisan dan mengurangi efektivitas Pemangkasan Bucket serta optimasi pengacakan.

Tetapkan jumlah bucket berdasarkan perkiraan pertumbuhan data, bukan hanya volume saat ini, untuk menghindari modifikasi struktur tabel yang sering.

Jika volume data Anda sangat besar, satu bucket dapat mendukung penyimpanan lebih besar, atau Anda dapat menetapkan jumlah bucket yang lebih tinggi. Namun, Anda harus mengevaluasi dampaknya terhadap performa tulis dan kueri berdasarkan kasus penggunaan spesifik Anda.