View a markdown version of this page

Meminimalkan waktu vakum - Amazon Redshift

Amazon Redshift tidak akan lagi mendukung penggunaan Python UDF setelah 30 Juni 2026. Kami akan mulai menegakkannya secara bertahap. Untuk informasi lebih lanjut tentang detail opsi akhir masa pakai dan migrasi Python, lihat posting blog yang diterbitkan pada 30 Juni 2025.

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Meminimalkan waktu vakum

Amazon Redshift secara otomatis mengurutkan data dan menjalankan VACUUM DELETE di latar belakang. Ini mengurangi kebutuhan untuk menjalankan perintah VACUUM. Menyedot debu berpotensi memakan waktu. Tergantung pada sifat data Anda, kami merekomendasikan praktik berikut untuk meminimalkan waktu vakum.

Putuskan apakah akan mengindeks ulang

Anda sering dapat meningkatkan kinerja kueri secara signifikan dengan menggunakan gaya pengurutan yang disisipkan, tetapi seiring waktu kinerja dapat menurun jika distribusi nilai dalam kolom kunci pengurutan berubah.

Saat pertama kali memuat tabel selisipan kosong menggunakan COPY atau CREATE TABLE AS, Amazon Redshift secara otomatis membuat indeks yang disisipkan. Jika Anda awalnya memuat tabel yang disisipkan menggunakan INSERT, Anda perlu menjalankan VACUUM REINDEX setelahnya untuk menginisialisasi indeks yang disisipkan.

Seiring waktu, saat Anda menambahkan baris dengan nilai kunci pengurutan baru, kinerja mungkin menurun jika distribusi nilai dalam kolom kunci pengurutan berubah. Jika baris baru Anda terutama berada dalam kisaran nilai kunci pengurutan yang ada, Anda tidak perlu mengindeks ulang. Jalankan VACUUM SORT ONLY atau VACUUM FULL untuk mengembalikan urutan pengurutan.

Mesin kueri dapat menggunakan urutan pengurutan untuk secara efisien memilih blok data mana yang perlu dipindai untuk memproses kueri. Untuk pengurutan yang disisipkan, Amazon Redshift menganalisis nilai kolom kunci pengurutan untuk menentukan urutan pengurutan yang optimal. Jika distribusi nilai kunci berubah, atau miring, saat baris ditambahkan, strategi pengurutan tidak akan lagi optimal, dan manfaat kinerja penyortiran akan menurun. Untuk menganalisis ulang distribusi kunci pengurutan, Anda dapat menjalankan VACUUM REINDEX. Operasi reindex memakan waktu, jadi untuk memutuskan apakah tabel akan mendapat manfaat dari indeks ulang, kueri tampilan. SVV_KOLUMN_INTERLEAVED_

Misalnya, kueri berikut menunjukkan detail untuk tabel yang menggunakan kunci pengurutan yang disisipkan.

select tbl as tbl_id, stv_tbl_perm.name as table_name, col, interleaved_skew, last_reindex from svv_interleaved_columns, stv_tbl_perm where svv_interleaved_columns.tbl = stv_tbl_perm.id and interleaved_skew is not null; tbl_id | table_name | col | interleaved_skew | last_reindex --------+------------+-----+------------------+-------------------- 100048 | customer | 0 | 3.65 | 2015-04-22 22:05:45 100068 | lineorder | 1 | 2.65 | 2015-04-22 22:05:45 100072 | part | 0 | 1.65 | 2015-04-22 22:05:45 100077 | supplier | 1 | 1.00 | 2015-04-22 22:05:45 (4 rows)

Nilai untuk interleaved_skew adalah rasio yang menunjukkan jumlah kemiringan. Nilai 1 berarti tidak ada kemiringan. Jika kemiringan lebih besar dari 1,4, VACUUM REINDEX biasanya akan meningkatkan kinerja kecuali kemiringan melekat pada himpunan yang mendasarinya.

Anda dapat menggunakan nilai tanggal last_reindex untuk menentukan berapa lama sejak indeks ulang terakhir.

Kurangi ukuran wilayah yang tidak disortir

Wilayah yang tidak disortir tumbuh ketika Anda memuat sejumlah besar data baru ke dalam tabel yang sudah berisi data atau ketika Anda tidak menyedot tabel sebagai bagian dari operasi pemeliharaan rutin Anda. Untuk menghindari operasi vakum yang berjalan lama, gunakan praktik berikut:

  • Jalankan operasi vakum pada jadwal reguler.

    Jika Anda memuat tabel secara bertahap (seperti pembaruan harian yang mewakili persentase kecil dari jumlah total baris dalam tabel), menjalankan VACUUM secara teratur akan membantu memastikan bahwa operasi vakum individu berjalan dengan cepat.

  • Jalankan beban terbesar terlebih dahulu.

    Jika Anda perlu memuat tabel baru dengan beberapa operasi COPY, jalankan beban terbesar terlebih dahulu. Saat Anda menjalankan beban awal ke tabel baru atau terpotong, semua data dimuat langsung ke wilayah yang diurutkan, sehingga tidak diperlukan vakum.

  • Memotong tabel alih-alih menghapus semua baris.

    Menghapus baris dari tabel tidak merebut kembali ruang yang ditempati baris sampai Anda melakukan operasi vakum; Namun, memotong tabel mengosongkan tabel dan mengambil kembali ruang disk, sehingga tidak diperlukan vakum. Atau, jatuhkan tabel dan buat kembali.

  • Potong atau jatuhkan tabel tes.

    Jika Anda memuat sejumlah kecil baris ke dalam tabel untuk tujuan pengujian, jangan hapus baris setelah selesai. Sebagai gantinya, potong tabel dan muat ulang baris tersebut sebagai bagian dari operasi beban produksi berikutnya.

  • Lakukan salinan mendalam.

    Jika tabel yang menggunakan tabel kunci pengurutan majemuk memiliki wilayah besar yang tidak disortir, salinan mendalam jauh lebih cepat daripada ruang hampa. Salinan mendalam membuat ulang dan mengisi ulang tabel dengan menggunakan sisipan massal, yang secara otomatis mengurutkan ulang tabel. Jika tabel memiliki wilayah besar yang tidak disortir, salinan dalam jauh lebih cepat daripada ruang hampa. Tukarnya adalah Anda tidak dapat membuat pembaruan bersamaan selama operasi penyalinan mendalam, yang dapat Anda lakukan selama vakum. Untuk informasi selengkapnya, lihat Praktik terbaik Amazon Redshift untuk merancang kueri.

Kurangi volume baris gabungan

Jika operasi vakum perlu menggabungkan baris baru ke dalam wilayah yang diurutkan tabel, waktu yang dibutuhkan untuk vakum akan meningkat saat tabel tumbuh lebih besar. Anda dapat meningkatkan kinerja vakum dengan mengurangi jumlah baris yang harus digabungkan.

Sebelum ruang hampa, tabel terdiri dari wilayah yang diurutkan di kepala tabel, diikuti oleh wilayah yang tidak disortir, yang tumbuh setiap kali baris ditambahkan atau diperbarui. Ketika satu set baris ditambahkan oleh operasi COPY, kumpulan baris baru diurutkan pada kunci pengurutan karena ditambahkan ke wilayah yang tidak disortir di akhir tabel. Baris baru diurutkan dalam kumpulannya sendiri, tetapi tidak di dalam wilayah yang tidak disortir.

Diagram berikut menggambarkan wilayah yang tidak disortir setelah dua operasi COPY berturut-turut, di mana kunci pengurutan adalah CUSTID. Untuk kesederhanaan, contoh ini menunjukkan kunci pengurutan majemuk, tetapi prinsip yang sama berlaku untuk kunci pengurutan yang disisipkan, kecuali bahwa dampak dari wilayah yang tidak disortir lebih besar untuk tabel yang disisipkan.

Tabel yang tidak disortir menyimpan catatan dari dua operasi COPY.

Sebuah vakum mengembalikan urutan tabel dalam dua tahap:

  1. Urutkan wilayah yang tidak disortir ke wilayah yang baru diurutkan.

    Tahap pertama relatif murah, karena hanya wilayah yang tidak disortir yang ditulis ulang. Jika rentang nilai kunci pengurutan dari wilayah yang baru diurutkan lebih tinggi dari rentang yang ada, hanya baris baru yang perlu ditulis ulang, dan ruang hampa selesai. Misalnya, jika wilayah yang diurutkan berisi nilai ID 1 hingga 500 dan operasi penyalinan berikutnya menambahkan nilai kunci lebih besar dari 500, maka hanya wilayah yang tidak disortir yang perlu ditulis ulang.

  2. Gabungkan wilayah yang baru diurutkan dengan wilayah yang diurutkan sebelumnya.

    Jika kunci di wilayah yang baru diurutkan tumpang tindih dengan kunci di wilayah yang diurutkan, maka VACUUM perlu menggabungkan baris. Mulai dari awal wilayah yang baru diurutkan (pada kunci pengurutan terendah), ruang hampa menulis baris gabungan dari wilayah yang diurutkan sebelumnya dan wilayah yang baru diurutkan ke dalam kumpulan blok baru.

Sejauh mana rentang kunci pengurutan baru tumpang tindih dengan kunci pengurutan yang ada menentukan sejauh mana wilayah yang diurutkan sebelumnya perlu ditulis ulang. Jika kunci yang tidak disortir tersebar di seluruh rentang pengurutan yang ada, ruang hampa mungkin perlu menulis ulang bagian tabel yang ada.

Diagram berikut menunjukkan bagaimana ruang hampa akan mengurutkan dan menggabungkan baris yang ditambahkan ke tabel di mana CUSTID adalah kunci pengurutan. Karena setiap operasi penyalinan menambahkan satu set baris baru dengan nilai kunci yang tumpang tindih dengan kunci yang ada, hampir seluruh tabel perlu ditulis ulang. Diagram menunjukkan pengurutan dan penggabungan tunggal, tetapi dalam praktiknya, ruang hampa besar terdiri dari serangkaian langkah pengurutan dan penggabungan inkremental.

Operasi VACUUM pada tabel contoh dalam dua langkah. Pertama baris baru diurutkan, kemudian digabungkan dengan baris yang ada.

Jika rentang kunci pengurutan dalam satu set baris baru tumpang tindih dengan kisaran kunci yang ada, biaya tahap penggabungan terus tumbuh sebanding dengan ukuran tabel saat tabel tumbuh sementara biaya tahap pengurutan tetap sebanding dengan ukuran wilayah yang tidak disortir. Dalam kasus seperti itu, biaya tahap penggabungan menutupi biaya tahap pengurutan, seperti yang ditunjukkan diagram berikut.

Diagram yang menunjukkan bagaimana tahap penggabungan menjadi lebih mahal ketika baris baru memiliki kunci pengurutan yang tumpang tindih dengan baris yang ada.

Untuk menentukan proporsi tabel yang digabungkan kembali, kueri SVV_VACUUM_SUMMARY setelah operasi vakum selesai. Kueri berikut menunjukkan efek dari enam penyedot debu berturut-turut karena CUSTSALES tumbuh lebih besar dari waktu ke waktu.

select * from svv_vacuum_summary where table_name = 'custsales'; table_name | xid | sort_ | merge_ | elapsed_ | row_ | sortedrow_ | block_ | max_merge_ | | partitions | increments | time | delta | delta | delta | partitions -----------+------+------------+------------+------------+-------+------------+---------+--------------- custsales | 7072 | 3 | 2 | 143918314 | 0 | 88297472 | 1524 | 47 custsales | 7122 | 3 | 3 | 164157882 | 0 | 88297472 | 772 | 47 custsales | 7212 | 3 | 4 | 187433171 | 0 | 88297472 | 767 | 47 custsales | 7289 | 3 | 4 | 255482945 | 0 | 88297472 | 770 | 47 custsales | 7420 | 3 | 5 | 316583833 | 0 | 88297472 | 769 | 47 custsales | 9007 | 3 | 6 | 306685472 | 0 | 88297472 | 772 | 47 (6 rows)

Kolom merge_increments memberikan indikasi jumlah data yang digabungkan untuk setiap operasi vakum. Jika jumlah kenaikan penggabungan selama vakum berturut-turut meningkat sebanding dengan pertumbuhan ukuran tabel, ini menunjukkan bahwa setiap operasi vakum menggabungkan kembali semakin banyak baris dalam tabel karena wilayah yang ada dan yang baru diurutkan tumpang tindih.

Muat data Anda dalam urutan kunci

Jika Anda memuat data Anda dalam urutan kunci dengan menggunakan perintah COPY, Anda dapat mengurangi atau bahkan menghapus kebutuhan untuk menyedot debu.

COPY secara otomatis menambahkan baris baru ke wilayah tabel yang diurutkan ketika semua hal berikut benar:

  • Tabel menggunakan kunci pengurutan majemuk dengan hanya satu kolom pengurutan.

  • Kolom pengurutan BUKAN NULL.

  • Tabel 100 persen diurutkan atau kosong.

  • Semua baris baru lebih tinggi dalam urutan urutan daripada baris yang ada, termasuk baris yang ditandai untuk dihapus. Dalam contoh ini, Amazon Redshift menggunakan delapan byte pertama dari kunci pengurutan untuk menentukan urutan.

  • Perintah COPY tidak memicu optimasi beban tertentu. Saat memuat volume data yang besar, Amazon Redshift mungkin mengoptimalkan kinerja dengan membuat partisi baru yang diurutkan daripada menambahkan baris ke wilayah yang diurutkan tabel.

Misalnya, Anda memiliki tabel yang merekam peristiwa pelanggan menggunakan ID pelanggan dan waktu. Jika Anda mengurutkan berdasarkan ID pelanggan, kemungkinan rentang kunci pengurutan baris baru yang ditambahkan oleh beban tambahan akan tumpang tindih dengan rentang yang ada, seperti yang ditunjukkan pada contoh sebelumnya, yang mengarah ke operasi vakum yang mahal.

Jika Anda mengatur kunci pengurutan ke kolom stempel waktu, baris baru Anda akan ditambahkan dalam urutan urutan di akhir tabel, seperti yang ditunjukkan diagram berikut, mengurangi atau bahkan menghilangkan kebutuhan untuk menyedot debu.

Tabel yang menggunakan kolom stempel waktu sebagai kunci pengurutan, mendapatkan catatan baru yang tidak perlu diurutkan.

Gunakan tabel deret waktu untuk mengurangi data yang disimpan

Jika Anda menyimpan data untuk periode waktu bergulir, gunakan serangkaian tabel, seperti yang digambarkan diagram berikut.

Lima tabel dengan data dari lima kuartal. Tabel tertua dihapus untuk mempertahankan waktu bergulir satu tahun.

Buat tabel baru setiap kali Anda menambahkan satu set data, lalu hapus tabel tertua dalam seri. Anda mendapatkan keuntungan ganda:

  • Anda menghindari biaya tambahan untuk menghapus baris, karena operasi DROP TABLE jauh lebih efisien daripada DELETE massal.

  • Jika tabel diurutkan berdasarkan stempel waktu, tidak diperlukan vakum. Jika setiap tabel berisi data selama satu bulan, ruang hampa paling banyak harus menulis ulang data senilai satu bulan, bahkan jika tabel tidak diurutkan berdasarkan stempel waktu.

Anda dapat membuat tampilan UNION ALL untuk digunakan dengan melaporkan kueri yang menyembunyikan fakta bahwa data disimpan dalam beberapa tabel. Jika kueri memfilter pada kunci pengurutan, perencana kueri dapat secara efisien melewati semua tabel yang tidak digunakan. UNION ALL bisa kurang efisien untuk jenis kueri lain, jadi Anda harus mengevaluasi kinerja kueri dalam konteks semua kueri yang menggunakan tabel.