Tema ini menjelaskan cara menggunakan perintah ANALYZE dan fitur auto-analyze.
Analyze
Statistik sangat penting untuk menghasilkan rencana eksekusi yang optimal. Hologres mengumpulkan statistik sampel tentang data, seperti distribusi data, karakteristik tabel dan kolom, jumlah baris, jumlah kolom, lebar bidang, kardinalitas, frekuensi, nilai maksimum dan minimum, nilai frekuensi tinggi, serta fitur distribusi bucketing. Informasi ini membantu pengoptimal memperbarui estimasi biaya untuk pelaksanaan operator, memangkas ruang pencarian, menentukan urutan penggabungan (join) yang optimal, serta memperkirakan overhead memori dan tingkat paralelisme. Proses ini menghasilkan rencana eksekusi yang lebih efisien.
Perintah ANALYZE mengumpulkan statistik tentang isi tabel dalam database. Pengoptimal kemudian menggunakan statistik ini untuk menghasilkan rencana kueri paling efisien dan meningkatkan kinerja kueri.
Sintaksis
-- Perbarui statistik tabel. Secara default, statistik dikumpulkan untuk semua kolom di tabel. analyze <tablename>; -- Perbarui statistik kolom tertentu. Perintah ini mengambil sampel lebih banyak data dibandingkan dengan perintah pembaruan statistik tabel, sehingga statistik yang dikumpulkan lebih akurat. Perintah ini terutama digunakan untuk memperbarui statistik kolom yang digunakan dalam klausa kondisi. analyze <tablename>(<colname>, <colname>);Parameter
tablename menentukan nama tabel yang ingin Anda perbarui statistiknya. colname menentukan nama kolom yang ingin Anda perbarui statistiknya.
Rincian sintaksis
Kedua perintah ANALYZE dijelaskan sebagai berikut:
Kesamaan
Kedua perintah mengumpulkan statistik kolom, termasuk jumlah baris, lebar kolom, nilai paling umum (MCVs), histogram, dan jumlah nilai unik (NDV).
Kedua perintah menimpa statistik kolom yang ditentukan tetapi tidak memengaruhi statistik kolom lainnya. Sebagai contoh, perintah
analyze <tablename>(<colname1>);menimpa (memperbarui) statistik sebelumnya yang dikumpulkan untuk kolomcolname1tetapi tidak mengubah statistik untuk kolomcolname2.
Perbedaan
Perintah
analyze <tablename>;menghitung statistik berdasarkan data sampel.Perintah
analyze <tablename>(<colname>, <colname>);menjalankan perhitungan `APPROX_COUNT_DISTINCT` untuk jumlah nilai unik (NDV) dari kolom yang ditentukan. Dalam banyak kasus, hasilnya lebih akurat daripada sampling tetapi menciptakan lebih banyak overhead. Oleh karena itu, Anda harus menggunakan perintah ini hanya untuk kolom tertentu yang penting. Statistik selain NDV, seperti histogram dan lebar, masih dikumpulkan melalui sampling.
Oleh karena itu, untuk tabel yang didefinisikan sebagai
table (colname1, colname2),analyze table;tidak sepenuhnya setara dengananalyze table(colname1, colname2);.Untuk kolom JOIN dan GROUP BY yang sering digunakan, gunakan perintah
analyze <tablename>(<colname>, <colname>);untuk mengumpulkan statistik tambahan.
Kapan menjalankan ANALYZE
Anda harus menjalankan perintah
analyze <tablename>;dalam skenario berikut:Setelah banyak operasi INSERT, UPDATE, atau DELETE dilakukan pada tabel, termasuk impor data.
Sebelum Anda melakukan kueri penggabungan multi-tabel jika performa telah menurun. Anda harus menganalisis kolom JOIN dan GROUP BY.
Setelah Anda mengeksekusi perintah
CREATE FOREIGN TABLE, gunakan Analyze untuk mengumpulkan informasi statistik untuk tabel eksternal.Setelah Anda menjalankan perintah
IMPORT FOREIGN SCHEMAuntuk menganalisis tabel yang akan Anda kueri.Setelah Anda menjalankan perintah
CREATE EXTERNAL DATABASEuntuk mengumpulkan statistik untuk tabel eksternal baru.
Catatan penggunaan
Dalam Hologres V0.10 dan V1.1, jika Anda mengkueri tabel induk, Anda harus menganalisis tabel induk. Jika Anda mengkueri tabel anak secara langsung, Anda harus menganalisis tabel anak. Jika Anda mengkueri keduanya, Anda harus menganalisis keduanya. Jika tidak, statistik mungkin tidak lengkap.
Jika Anda mengalami masalah berikut, Anda dapat menjalankan ANALYZE sebelum tugas impor untuk meningkatkan efisiensi:
Operasi penggabungan multi-tabel menyebabkan kesalahan kehabisan memori (OOM). Pesan kesalahan tipikal adalah
Query executor exceeded total memory limitation xxxxx: yyyy bytes used.Efisiensi impor rendah. Saat Anda mengkueri atau mengimpor data di Hologres, performa rendah dan tugas berjalan lama untuk diselesaikan.
Jika sebuah tabel memiliki kolom ultra-lebar, seperti data BYTEA untuk bitmap atau data TEXT yang melebihi 1 KB, statistik untuk kolom-kolom ini tidak berguna dan menyebabkan sampling mengonsumsi lebih banyak memori. Untuk tabel dengan kolom semacam itu, hindari menjalankan perintah
analyze <tablename>;. Sebaliknya, gunakananalyze <tablename>(<colname>, <colname>);untuk mengecualikan kolom ultra-lebar dan hanya menganalisis kolom yang diperlukan, seperti kolom JOIN, GROUP BY, dan filter.Catatan1 KB adalah nilai empiris. Anda dapat menyesuaikan standar lebar ini sesuai kebutuhan.
Auto-analyze
Untuk mengurangi operasi ANALYZE manual yang berulang, Hologres V0.10 dan versi berikutnya mendukung fitur auto-analyze. Saat auto-analyze diaktifkan, sistem secara otomatis menentukan apakah akan menjalankan ANALYZE pada tabel yang relevan di latar belakang berdasarkan pembuatan tabel, penulisan data, dan modifikasi. Ini menghilangkan kebutuhan untuk menjalankan ANALYZE secara manual pada tabel, yang mengurangi kompleksitas operasional dan mencegah statistik hilang karena lupa menjalankan ANALYZE.
Sintaksis
Periksa apakah auto-analyze diaktifkan
SHOW hg_enable_start_auto_analyze_worker; -- Sintaksis untuk V1.1 dan yang lebih baru untuk memeriksa status aktif saat ini SHOW hg_experimental_enable_start_auto_analyze_worker; -- Sintaksis untuk V0.10 untuk memeriksa status aktif saat iniSuperuser dapat menggunakan sintaksis berikut untuk mengaktifkan atau menonaktifkan fitur ini.
-- Tingkat DB. Berlaku untuk seluruh DB setelah dieksekusi. Sintaksis untuk mengaktifkan/menonaktifkan di V1.1 dan yang lebih baru. ALTER DATABASE dbname SET hg_enable_start_auto_analyze_worker = ON; -- Aktifkan (default) ALTER DATABASE dbname SET hg_enable_start_auto_analyze_worker = OFF; -- Nonaktifkan -- Tingkat DB. Berlaku untuk seluruh DB setelah dieksekusi. Sintaksis untuk mengaktifkan/menonaktifkan di V0.10. ALTER DATABASE dbname SET hg_experimental_enable_start_auto_analyze_worker = ON; -- Aktifkan (default) ALTER DATABASE dbname SET hg_experimental_enable_start_auto_analyze_worker = OFF; -- Nonaktifkan -- Tingkat DB. Aktifkan auto-analyze untuk database eksternal. ALTER EXTERNAL DATABASE dbname WITH enable_auto_analyze 'true';
Batasan
Fitur auto-analyze di Hologres memiliki batasan berikut:
Fitur auto-analyze hanya didukung di Hologres V0.10 dan yang lebih baru. Anda dapat melihat versi instans Hologres Anda di halaman detail instans di Konsol Hologres. Jika versi instans Anda lebih awal dari V0.10, Anda harus meningkatkannya. Untuk informasi tentang cara menyelesaikan kegagalan persiapan peningkatan umum, lihat Kegagalan persiapan peningkatan umum. Anda juga dapat bergabung dengan grup DingTalk Hologres untuk umpan balik. Untuk informasi lebih lanjut, lihat Bagaimana saya bisa mendapatkan lebih banyak dukungan online?.
Hanya superuser yang dapat mengaktifkan atau menonaktifkan fitur auto-analyze.
Auto-analyze memiliki batasan berikut pada tabel partisi:
Jika tabel partisi anak berubah dan memicu auto-analyze, tabel induknya dianalisis.
Tabel partisi memiliki batas pemindaian baris. Selama pengambilan sampel data, jumlah maksimum catatan yang dipindai secara default adalah 224 (16.777.216). Jika jumlah total catatan di semua tabel partisi anak melebihi batas ini, pemangkasan partisi dilakukan. Dalam hal ini, hanya beberapa partisi yang diambil sampelnya, dan jumlah total catatan di partisi yang diambil sampelnya tidak melebihi 16.777.216.
CatatanStatistik untuk kolom kunci partisi selalu lengkap dan tidak terpengaruh oleh pemangkasan. Namun, ini dapat memengaruhi statistik kolom yang memiliki distribusi data serupa dengan kolom kunci partisi, seperti kolom yang berisi data yang sama dengan kolom kunci partisi. Ini berarti beberapa nilai mungkin tidak diambil sampelnya, dan perkiraan jumlah baris mungkin tidak akurat. Jika diperlukan, Anda dapat mencari ID grup DingTalk 32314975 untuk bergabung dengan grup Gudang Data Real-time Hologres dan menghubungi dukungan teknis. Tim dukungan teknis dapat mengevaluasi instans Anda dan menyesuaikan jumlah maksimum catatan yang dipindai.
Secara default, auto-analyze mengumpulkan statistik untuk maksimum 256 kolom. Jika sebuah tabel memiliki lebih dari 256 kolom, 256 kolom pertama dipilih. Anda dapat menyesuaikan nilai ini dengan mengubah parameter
hg_experimental_auto_analyze_max_columns_count.Secara default, satu pekerja dibatasi hingga 4 GB memori. Jika ada kolom ultra-lebar, pengambilan sampel mungkin melebihi batas memori ini dan menyebabkan ANALYZE gagal. Anda dapat menyesuaikan parameter
auto_analyze_work_memory_mbuntuk mengubah batas ini, tetapi perhatikan dampaknya pada memori sistem. Tipe instans yang lebih tinggi memiliki lebih banyak pekerja dan batas memori yang lebih besar untuk auto-analyze.Mulai dari Hologres V3.1.0, Anda dapat menggunakan ANALYZE dan auto-analyze untuk mengumpulkan statistik untuk tabel asing dalam database eksternal.
ANALYZE dan auto-analyze tidak didukung untuk tabel asing HMS.
Cara kerja auto-analyze
Setelah Anda mengaktifkan auto-analyze, sistem latar belakang secara berkala memeriksa apakah ada tabel yang perlu dianalisis.
Tabel standar (tabel internal, termasuk tabel non-partisi dan partisi)
Setiap menit, sistem memeriksa tindakan terbaru pada tabel. Tindakan ini terutama adalah operasi DML, seperti INSERT, UPDATE, dan DELETE, yang dapat mengubah volume data. Jika salah satu dari kondisi berikut terpenuhi, sistem memicu operasi ANALYZE untuk tabel tersebut untuk mengumpulkan statistik:
Operasi DML telah selesai pada tabel, dan jumlah baris yang berubah melebihi 10% dari total baris di tabel. Jika tabel adalah tabel partisi anak, ambang batas ini berlaku untuk jumlah baris di partisi tertentu tersebut.
Tabel dibersihkan menggunakan perintah `TRUNCATE TABLE`.
Bahasa Definisi Data (DDL) tabel berubah. Contohnya termasuk membuat tabel dengan `CREATE TABLE` atau memodifikasi skema tabel dengan `ALTER TABLE`. Pemicu ini tidak termasuk memodifikasi properti tabel dengan `CALL SET_TABLE_PROPERTY`.
Setiap 10 menit, sistem memeriksa perubahan data di semua tabel internal. Jika jumlah baris yang berubah melebihi 10% sejak pemeriksaan terakhir, operasi ANALYZE dipicu untuk tabel tersebut di latar belakang.
CatatanLangkah ini mendeteksi data yang diperbarui oleh operasi DML non-eksplisit, seperti penulisan real-time dari Flink, Data Integration, atau HoloClient.
Tabel asing
Setiap 4 jam, sistem secara berkala memeriksa perubahan metadata atau data di tabel asing. Jika kondisi berikut terpenuhi, sistem memicu operasi ANALYZE untuk tabel tersebut untuk mengumpulkan statistik:
Tabel yang sesuai di sistem eksternal, seperti tabel asing MaxCompute atau tabel asing DLF, telah berubah dalam interval pemeriksaan (misalnya, 4 jam terakhir). Perubahan terdeteksi jika
last_modify_timedari tabel MaxCompute yang sesuai jatuh dalam interval ini.
CatatanPemeriksaan dan eksekusi merupakan bagian dari tugas penjadwalan yang sama. Oleh karena itu, dimulainya pemeriksaan berikutnya bergantung pada selesainya eksekusi ANALYZE. Pemeriksaan berikutnya dapat dimulai selama epoch penjadwalan telah berlalu sejak pemeriksaan sebelumnya dimulai.
Parameter konfigurasi
Setelah Anda mengaktifkan auto-analyze, sistem, secara default, secara otomatis melakukan pemeriksaan berkala untuk menentukan tabel mana yang perlu dianalisis. Kemudian melakukan perhitungan pengambilan sampel untuk mengumpulkan statistik, yang mengonsumsi beberapa sumber daya sistem.
Dalam beberapa skenario, mekanisme default mungkin tidak cocok. Misalnya, dalam skenario di mana data tidak sering ditulis atau diperbarui, Anda dapat mengurangi frekuensi auto-analyze dengan memodifikasi parameter default. Anda dapat mengubah parameter default sesuai kebutuhan untuk mengoptimalkan performa.
CatatanHanya superuser yang dapat menyesuaikan perilaku default auto-analyze. Semua parameter harus diatur pada tingkat database dan mulai berlaku dalam satu menit.
Sintaksis
-- Superuser memodifikasi nilai default parameter auto-analyze. ALTER DATABASE <dbname> SET <GUC>=<values>;dbname menentukan nama database. GUC menentukan nama parameter. values menentukan nilai parameter.
Daftar parameter
Parameter
Deskripsi
Versi yang didukung
Nilai default
Contoh
autovacuum_naptime
Interval di mana sistem memeriksa tindakan terbaru pada tabel. Unit: detik (s).
V1.1.0 dan yang lebih baru
CatatanParameter ini harus disesuaikan oleh backend. Untuk melakukan penyesuaian, cari ID grup DingTalk 32314975 untuk bergabung dengan grup Gudang Data Real-time Hologres dan ajukan permintaan.
60s
ALTER DATABASE <dbname> SET autovacuum_naptime = 60;ALTER DATABASE <dbname> SET autovacuum_naptime = '60s';ALTER DATABASE <dbname> SET autovacuum_naptime = '10min';
hg_auto_check_table_changes_interval
Interval di mana sistem memeriksa perubahan data di semua tabel internal. Unit: detik (s).
V1.1.0 dan yang lebih baru
600s (10 min)
-- Sintaksis perintah untuk V1.1 dan yang lebih baru ALTER DATABASE <dbname> SET hg_auto_check_table_changes_interval = '600s'; -- Sintaksis perintah untuk V0.10 ALTER DATABASE <dbname> SET hg_experimental_auto_check_table_changes_interval = '600s';hg_auto_check_foreign_table_changes_interval
Interval di mana sistem memeriksa perubahan data di semua tabel asing. Unit: detik (s).
V1.1.0 dan yang lebih baru
14400s (4 jam)
-- Sintaksis perintah untuk V1.1 dan yang lebih baru ALTER DATABASE <dbname> SET hg_auto_check_foreign_table_changes_interval = '14400s'; -- Sintaksis perintah untuk V0.10 ALTER DATABASE <dbname> SET hg_experimental_auto_check_foreign_table_changes_interval = '14400s';hg_experimental_auto_analyze_max_columns_count
Jumlah kolom untuk mana statistik dikumpulkan secara otomatis.
V1.1.0 dan yang lebih baru
256
ALTER DATABASE <dbname> SET hg_experimental_auto_analyze_max_columns_count =300;auto_analyze_work_memory_mb
Batas memori untuk auto-analyze pada satu tabel. Unit: MB.
V1.1.54 dan yang lebih baru
Defaultnya adalah 4.096 MB (4 GB) untuk satu pekerja. Semakin tinggi tipe instans, semakin banyak pekerja yang tersedia, dan semakin besar batas memori aktual untuk auto-analyze.
Ubah batas memori untuk auto-analyze pada satu tabel menjadi 9 GB.
ALTER DATABASE <dbname> SETauto_analyze_work_memory_mb =9216;hg_experimental_auto_analyze_start_time
Waktu mulai untuk auto-analyze berjalan setiap hari.
CatatanZona waktu harus sama dengan end_time, dan waktu mulai harus lebih awal atau sama dengan waktu akhir.
V1.1.54 dan yang lebih baru
00:00 +0800
Ubah pengaturan agar auto-analyze hanya berjalan dari 00:00 hingga 06:00. Ini cocok untuk skenario di mana data di tabel internal dan asing tidak berubah selama hari dan tidak memerlukan analisis.
ALTER DATABASE <dbname> SET hg_experimental_auto_analyze_start_time = '00:00 +0800';ALTER DATABASE <dbname> SET hg_experimental_auto_analyze_end_time = '06:00 +0800';
hg_experimental_auto_analyze_end_time
Waktu akhir untuk auto-analyze berjalan setiap hari.
V1.1.54 dan yang lebih baru
23:59 +0800
autovacuum_enabled
Status aktif auto-analyze untuk sebuah tabel.
V1.1.54 dan yang lebih baru
true, yang berarti diaktifkan untuk semua tabel secara default.
Nonaktifkan auto-analyze untuk tabel tertentu. Operasi ANALYZE di masa mendatang akan melewati tabel ini.
CatatanAnda hanya dapat menggunakan perintah berikut untuk menonaktifkan auto-analyze untuk tabel internal Hologres.
ALTER TABLE <tablename> SET (autovacuum_enabled = false);
Optimasi lainnya
Hologres V3.1 memperkenalkan fitur Fast Rows. Jika Hologres menemukan bahwa sebuah tabel dalam kueri tidak memiliki statistik, ia langsung mengambil jumlah baris untuk tabel tersebut dari mesin penyimpanan. Biaya pengambilan jumlah baris sekitar 10 ms. Perintahnya adalah sebagai berikut:
-- Tingkat DB. Berlaku untuk seluruh DB setelah dieksekusi. Sintaksis untuk mengaktifkan.
ALTER DATABASE dbname SET hg_experimental_get_fast_num_of_rows = ON; -- Aktifkan (dinonaktifkan secara default)
-- Tingkat DB. Berlaku untuk seluruh DB setelah dieksekusi. Sintaksis untuk menonaktifkan.
ALTER DATABASE dbname SET hg_experimental_get_fast_num_of_rows = OFF; -- Nonaktifkan (dinonaktifkan secara default)Jika fitur Fast Rows dinonaktifkan, Anda dapat mengurangi kemungkinan rencana yang salah dalam dua kasus berikut:
Jika sebuah tabel tidak memiliki statistik, rencana kueri menunjukkan `rows=1000`. Ini menunjukkan bahwa statistik hilang, dan rencana dibuat berdasarkan estimasi 1.000 baris.
Jika sistem menganggap tabel kosong, rencana kueri menunjukkan `rows=1`. Ini menunjukkan bahwa statistik hilang, dan rencana dibuat berdasarkan estimasi satu baris.

Ketika fitur Fast Rows diaktifkan dan sebuah tabel tidak memiliki statistik, rencana kueri menunjukkan jumlah baris selain 1.000. Hal ini karena sistem telah memanggil mesin penyimpanan untuk mengambil jumlah baris aktual untuk tabel tersebut.

Statistik kueri
Statistik tabel dicatat dalam tabel hologres_statistic.hg_table_statistic. Anda dapat mengkueri tabel ini untuk memeriksa status operasi ANALYZE menggunakan perintah berikut:
Untuk mengkueri informasi tentang operasi ANALYZE terbaru, urutkan hasil berdasarkan analyze_timestamp.
SELECT schema_name, -- Skema tabel
table_name, -- Nama tabel
schema_version, -- Versi tabel
statistic_version, -- Versi statistik dari ANALYZE terakhir
total_rows, -- Jumlah baris dari ANALYZE terakhir
analyze_timestamp -- Waktu akhir ANALYZE terakhir
FROM hologres_statistic.hg_table_statistic
WHERE table_name = '<tablename>'
ORDER BY analyze_timestamp DESC;Setiap tabel memiliki
0 hingga ncatatan di tabel hologres_statistic.hg_table_statistic. Nol catatan berarti ANALYZE belum pernah dijalankan. Satu atau lebih catatan berarti ANALYZE telah dijalankan setidaknya sekali.Jika ada dua atau lebih catatan untuk sebuah tabel, nilai schema_version mereka akan berbeda. Ini terjadi ketika skema tabel telah berubah. Sebagai contoh, menjalankan perintah seperti
ADD COLUMNmembuat versi skema baru. Catatan statistik baru ditambahkan, dan catatan yang sesuai dengan schema_version lama tidak lagi digunakan.Contoh berikut menunjukkan hasil kueri di mana tabel yang sama memiliki dua catatan. schema_version dari catatan kedua lebih rendah daripada yang pertama. Oleh karena itu, catatan kedua sudah usang dan dapat diabaikan.
schema_name | table_name | schema_version | statistic_version | total_rows | analyze_timestamp -------------+------------------+----------------+-------------------+------------+--------------------- public | tbl_name_example | 13 | 8580 | 10002 | 2022-04-29 16:03:18 public | tbl_name_example | 10 | 8576 | 10002 | 2022-04-29 15:41:20 (2 rows)Hologres V0.10 dan V1.1 tidak membersihkan catatan kadaluarsa historis dari tabel hg_table_statistic. Anda dapat mengabaikan data lama ini.
Lihat tabel dengan statistik yang hilang
Anda dapat menggunakan tampilan HG_STATS_MISSING untuk mengidentifikasi tabel mana di database saat ini yang kehilangan statistik. Untuk informasi lebih lanjut, lihat Tampilan HG_STATS_MISSING.
Pertanyaan Umum
Jika Anda mengalami masalah berikut, auto-analyze mungkin tidak bekerja dengan benar. Ikuti solusi yang disarankan untuk menyelesaikannya:
Tabel tidak memiliki catatan statistik
Gejala: Saat Anda mengkueri tabel hologres_statistic.hg_table_statistic untuk statistik tabel, tidak ada data yang dikembalikan.
Penyebab yang mungkin:
Auto-analyze tidak berfungsi, atau tabel tidak memenuhi kondisi pemicu untuk auto-analyze.
Ada masalah dengan fitur auto-analyze itu sendiri. Anda dapat ajukan tiket untuk menyelidiki penyebabnya.
Solusi: Secara manual picu operasi ANALYZE.
analyze_timestampterlalu lamaGejala: Dalam hasil kueri,
analyze_timestampjauh lebih awal dari waktu saat ini. Ini berarti ANALYZE belum dijalankan untuk waktu yang lama.Penyebab yang mungkin:
Auto-analyze gagal dijalankan.
Auto-analyze dinonaktifkan secara manual.
Solusi: Pertama, secara manual picu operasi ANALYZE. Kemudian, Anda dapat ajukan tiket untuk menyelidiki penyebabnya.