ApsaraDB for SelectDB memungkinkan Anda memicu pengumpulan statistik secara manual atau mengaktifkan pengumpulan otomatis. Statistik yang dikumpulkan dapat digunakan untuk mengoptimalkan kinerja kueri.
Ikhtisar
ApsaraDB for SelectDB mendukung pengumpulan statistik baik secara manual maupun otomatis. Statistik ini membantu pengoptimal memahami karakteristik distribusi data. Selama optimasi berbasis biaya (CBO), pengoptimal menghitung selektivitas predikat dan memperkirakan biaya setiap rencana eksekusi berdasarkan statistik yang telah dikumpulkan. Dengan demikian, pengoptimal dapat memilih rencana kueri optimal untuk meningkatkan efisiensi kueri secara signifikan.
Statistik yang akan dikumpulkan
Dalam sebagian besar kasus, informasi berikut dikumpulkan untuk setiap kolom.
Informasi | Deskripsi |
row_count | Jumlah total baris. |
data_size | Jumlah total data. |
avg_size_byte | Panjang rata-rata nilai. |
ndv | Jumlah nilai berbeda. |
min | Nilai minimum. |
max | Nilai maksimum. |
null_count | Jumlah nilai null. |
Pengumpulan statistik
ApsaraDB for SelectDB memungkinkan Anda mengeksekusi pernyataan ANALYZE guna mengumpulkan dan memperbarui statistik secara manual.
Sintaksis
ANALYZE < TABLE | DATABASE table_name | db_name >
[ (column_name [, ...]) ]
[ [ WITH SYNC ] [ WITH SAMPLE PERCENT | ROWS ] ];Deskripsi parameter
Parameter | Deskripsi |
table_name | Nama tabel yang statistiknya ingin Anda kumpulkan. Nilainya dapat ditentukan dalam format |
column_name | Nama kolom yang statistiknya ingin Anda kumpulkan. Kolom tersebut harus ada di tabel yang ditentukan oleh parameter |
sync | Jika parameter ini ditentukan, pekerjaan pengumpulan statistik dieksekusi dalam mode sinkron dan hasil eksekusi dikembalikan setelah pekerjaan selesai. Jika parameter ini tidak ditentukan, pekerjaan pengumpulan statistik dieksekusi dalam mode asinkron dan ID pekerjaan dikembalikan. |
sample percent | rows | Anda dapat menentukan parameter ini untuk melakukan sampling informasi untuk pengumpulan statistik. Anda dapat menentukan rasio sampling atau jumlah baris yang akan diambil sampelnya. |
Contoh
Kumpulkan statistik untuk tabel dengan rasio sampling 10%:
ANALYZE TABLE lineitem WITH SAMPLE PERCENT 10;Kumpulkan statistik untuk tabel dengan mengambil sampel 100.000 baris data:
ANALYZE TABLE lineitem WITH SAMPLE ROWS 100000;
Pengumpulan otomatis
Secara default, fitur pengumpulan otomatis diaktifkan.
Logika eksekusi
Setelah transaksi impor di-commit, ApsaraDB for SelectDB mencatat jumlah baris tabel yang diperbarui oleh transaksi impor untuk memperkirakan kesehatan statistik tabel. Untuk tabel yang statistiknya belum dikumpulkan, kesehatan statistiknya adalah 0. Anda dapat menentukan parameter table_stats_health_threshold untuk menetapkan ambang batas kesehatan statistik. Dalam contoh ini, nilai yang digunakan adalah 60. Jika kesehatan statistik suatu tabel lebih rendah dari 60, ApsaraDB for SelectDB menganggap bahwa statistik tabel tersebut sudah usang dan memicu pekerjaan pengumpulan statistik untuk tabel tersebut dalam operasi selanjutnya. Untuk tabel dengan kesehatan statistik lebih tinggi dari 60, tidak dilakukan pengumpulan ulang.
Konfigurasi parameter
Pekerjaan pengumpulan statistik membutuhkan sejumlah sumber daya sistem. Untuk meminimalkan overhead, ApsaraDB for SelectDB secara otomatis menggunakan sampling untuk mengumpulkan statistik pada tabel yang ukurannya melebihi ambang batas tertentu. Secara default, ambang batas ditetapkan pada 5 GiB. Anda dapat menyesuaikan ambang batas ini dengan menentukan parameter frontend (FE) huge_table_lower_bound_size_in_bytes. Dalam pengumpulan otomatis, ApsaraDB for SelectDB secara default mengambil sampel 4.194.304 (2^22) baris data untuk mengurangi beban kerja sistem dan menyelesaikan pekerjaan pengumpulan statistik sesegera mungkin.
Jika Anda ingin mengambil lebih banyak sampel baris untuk mendapatkan informasi distribusi data yang lebih akurat, Anda dapat menentukan parameter huge_table_default_sample_rows guna meningkatkan jumlah baris yang diambil sampelnya. Selain itu, ApsaraDB for SelectDB memastikan bahwa interval pengumpulan tidak kurang dari periode waktu tertentu untuk tabel dengan ukuran lebih besar dari ambang batas yang ditentukan pada parameter huge_table_lower_bound_size_in_bytes. Secara default, interval minimum adalah 12 jam. Anda dapat menyesuaikan interval minimum ini dengan menentukan parameter huge_table_auto_analyze_interval_in_millis.
Untuk mencegah dampak terhadap bisnis Anda selama pelaksanaan pekerjaan pengumpulan otomatis, Anda dapat menentukan parameter auto_analyze_start_time dan auto_analyze_end_time sesuai kebutuhan bisnis, sehingga pekerjaan pengumpulan otomatis berjalan hanya pada jam-jam sepi. Selain itu, Anda dapat menonaktifkan fitur ini dengan mengatur parameter enable_auto_analyze ke false.
Secara default, fitur pengumpulan otomatis dinonaktifkan untuk katalog eksternal. Jika diaktifkan, konsumsi sumber daya berlebih dapat terjadi karena katalog eksternal berisi sejumlah besar data historis. Anda dapat mengonfigurasi properti katalog eksternal untuk mengaktifkan atau menonaktifkan fitur pengumpulan otomatis.
ALTER CATALOG external_catalog SET PROPERTIES ('enable.auto.analyze'='true'); // Aktifkan fitur pengumpulan otomatis untuk katalog eksternal.
ALTER CATALOG external_catalog SET PROPERTIES ('enable.auto.analyze'='false'); // Nonaktifkan fitur pengumpulan otomatis untuk katalog eksternal.Manajemen pekerjaan
Lihat pekerjaan pengumpulan statistik
Anda dapat mengeksekusi pernyataan SHOW ANALYZE untuk melihat informasi terkait pekerjaan pengumpulan statistik.
Sintaksis
SHOW [AUTO] ANALYZE < table_name | job_id >
[ WHERE [ STATE = [ "PENDING" | "RUNNING" | "FINISHED" | "FAILED" ] ] ];Deskripsi parameter
Parameter | Deskripsi |
AUTO | Informasi tentang pekerjaan pengumpulan otomatis historis. Catatan Secara default, status hanya 20.000 pekerjaan pengumpulan otomatis terbaru yang selesai disimpan. |
table_name | Nama tabel yang pekerjaan pengumpulan statistiknya ingin Anda lihat. Nilainya dapat ditentukan dalam format |
job_id | ID pekerjaan pengumpulan statistik yang ingin Anda lihat. Anda dapat memperoleh ID pekerjaan dari output pernyataan |
Contoh
SHOW ANALYZE 245073\G;
*************************** 1. row ***************************
job_id: 245073
catalog_name: internal
db_name: default_cluster:tpch
tbl_name: lineitem
col_name: [l_returnflag,l_receiptdate,l_tax,l_shipmode,l_suppkey,l_shipdate,l_commitdate,l_partkey,l_orderkey,l_quantity,l_linestatus,l_comment,l_extendedprice,l_linenumber,l_discount,l_shipinstruct]
job_type: MANUAL
analysis_type: FUNDAMENTALS
message:
last_exec_time_in_ms: 2023-11-07 11:00:52
state: FINISHED
progress: 16 Finished | 0 Failed | 0 In Progress | 16 Total
schedule_type: ONCETabel berikut menjelaskan parameter dalam output:
Parameter | Deskripsi |
job_id | ID pekerjaan pengumpulan statistik. |
catalog_name | Nama katalog. |
db_name | Nama database. |
tbl_name | Nama tabel. |
col_name | Nama kolom. |
job_type | Jenis pekerjaan. |
analysis_type | Jenis statistik. |
message | Informasi tentang pekerjaan pengumpulan statistik. |
last_exec_time_in_ms | Waktu ketika pekerjaan pengumpulan statistik terakhir dieksekusi. |
state | Status pekerjaan pengumpulan statistik. |
schedule_type | Metode penjadwalan pekerjaan pengumpulan statistik. |
Lihat informasi tentang pengumpulan statistik tabel
Anda dapat mengeksekusi pernyataan SHOW TABLE STATS untuk melihat informasi terkait pengumpulan statistik tabel.
Sintaksis
SHOW TABLE STATS <table_name>;Deskripsi parameter
Parameter | Deskripsi |
table_name | Nama tabel yang statistiknya ingin Anda lihat. Nilainya dapat ditentukan dalam format |
Contoh
Pernyataan berikut menunjukkan contoh cara melihat informasi tentang statistik yang dikumpulkan dari tabel lineitem:
SHOW TABLE STATS lineitem\G
*************************** 1. row ***************************
updated_rows: 0
query_times: 0
row_count: 6001215
updated_time: 2023-11-07
columns: [l_returnflag, l_receiptdate, l_tax, l_shipmode, l_suppkey, l_shipdate, l_commitdate, l_partkey, l_orderkey, l_quantity, l_linestatus, l_comment, l_extendedprice, l_linenumber, l_discount, l_shipinstruct]
trigger: MANUALTabel berikut menjelaskan parameter dalam output:
Parameter | Deskripsi |
updated_rows | Jumlah baris tabel yang diperbarui oleh pernyataan ANALYZE terakhir. |
query_times | Kolom cadangan. Di versi mendatang, parameter ini menunjukkan jumlah kueri yang dilakukan pada tabel. |
row_count | Jumlah baris tabel. Nilai parameter ini tidak menunjukkan jumlah baris yang tepat selama eksekusi. |
updated_time | Waktu ketika statistik yang dikumpulkan terakhir diperbarui. |
columns | Kolom tempat statistik dikumpulkan. |
trigger | Metode pemicu pekerjaan pengumpulan statistik. |
Lihat informasi tentang pengumpulan statistik kolom
Setiap pekerjaan pengumpulan statistik terdiri dari satu atau lebih tugas, di mana setiap tugas berkaitan dengan pengumpulan kolom. Anda dapat mengeksekusi pernyataan berikut untuk melihat informasi terkait pengumpulan statistik pada kolom tertentu.
Sintaksis
SHOW ANALYZE TASK STATUS [job_id]Deskripsi parameter
Parameter | Deskripsi |
job_id | ID pekerjaan pengumpulan statistik. |
Contoh
Pernyataan berikut menunjukkan contoh cara melihat informasi tentang tugas pengumpulan statistik dengan ID 20038:
SHOW ANALYZE TASK STATUS 20038;
+---------+----------+---------+----------------------+----------+
| task_id | col_name | message | last_exec_time_in_ms | state |
+---------+----------+---------+----------------------+----------+
| 20039 | col4 | | 2023-06-01 17:22:15 | FINISHED |
| 20040 | col2 | | 2023-06-01 17:22:15 | FINISHED |
| 20041 | col3 | | 2023-06-01 17:22:15 | FINISHED |
| 20042 | col1 | | 2023-06-01 17:22:15 | FINISHED |
+---------+----------+---------+----------------------+----------+Lihat statistik kolom
Anda dapat mengeksekusi pernyataan SHOW COLUMN STATS untuk melihat statistik kolom.
Sintaksis
SHOW COLUMN [cached] STATS table_name [ (column_name [, ...]) ];Deskripsi parameter
Parameter | Deskripsi |
cached | Statistik dalam cache memori FE. |
table_name | Nama tabel yang statistik kolomnya ingin Anda lihat. Nilainya dapat ditentukan dalam format |
column_name | Nama kolom yang statistiknya ingin Anda lihat. Kolom tersebut harus ada di tabel yang ditentukan oleh parameter |
Contoh
Pernyataan berikut menunjukkan contoh cara melihat statistik kolom l_tax:
SHOW COLUMN STATS lineitem(l_tax)\G
*************************** 1. row ***************************
column_name: l_tax
count: 6001215.0
ndv: 9.0
num_null: 0.0
data_size: 4.800972E7
avg_size_byte: 8.0
min: 0.00
max: 0.08
method: FULL
type: FUNDAMENTALS
trigger: MANUAL
query_times: 0
updated_time: 2023-11-07 11:00:46Hentikan pekerjaan pengumpulan statistik
Anda dapat mengeksekusi pernyataan KILL ANALYZE untuk menghentikan proses pengumpulan statistik.
Sintaksis
KILL ANALYZE job_id;Deskripsi parameter
Parameter | Deskripsi |
job_id | ID pekerjaan pengumpulan statistik. Anda dapat memperoleh ID pekerjaan dari output pernyataan |
Contoh
Pernyataan berikut menunjukkan contoh cara menghentikan pekerjaan pengumpulan statistik dengan ID 52357:
KILL ANALYZE 52357;Variabel sesi dan item konfigurasi FE
Variabel sesi
Variabel sesi | Nilai default | Deskripsi |
auto_analyze_start_time | 00:00:00 | Waktu mulai pekerjaan pengumpulan otomatis. |
auto_analyze_end_time | 23:59:59 | Waktu akhir pekerjaan pengumpulan otomatis. |
enable_auto_analyze | true | Menentukan apakah fitur pengumpulan otomatis diaktifkan. |
huge_table_default_sample_rows | 4194304 | Jumlah baris yang akan diambil sampelnya untuk tabel besar. |
huge_table_lower_bound_size_in_bytes | 5368709120 | Ambang batas untuk pengambilan sampel. Jika ukuran tabel melebihi nilai ini, pengambilan sampel otomatis digunakan selama pengumpulan otomatis. |
huge_table_auto_analyze_interval_in_millis | 43200000 | Interval minimum di mana pengumpulan otomatis dilakukan untuk tabel besar. Selama interval yang ditentukan, pengumpulan otomatis hanya dilakukan sekali untuk tabel yang ukurannya lebih besar dari ambang batas yang ditentukan untuk parameter |
table_stats_health_threshold | 60 | Ambang batas kesehatan statistik. Nilai valid: 0 hingga 100. Jika rasio data yang diperbarui mencapai nilai |
analyze_timeout | 43200 | Periode timeout pekerjaan pengumpulan statistik. Satuan: detik. |
auto_analyze_table_width_threshold | 70 | Jumlah maksimum kolom yang dapat dimiliki oleh tabel yang digunakan untuk pengumpulan otomatis. Jika jumlah kolom dalam tabel melebihi nilai tersebut, tabel tidak berpartisipasi dalam pengumpulan otomatis. |
Item konfigurasi FE
Item konfigurasi FE berikut terkait dengan statistik yang akan dikumpulkan. Pada sebagian besar kasus, Anda tidak perlu memfokuskan perhatian pada item konfigurasi ini.
Item konfigurasi FE | Nilai default | Deskripsi |
analyze_record_limit | 20000 | Jumlah maksimum baris persisten yang dapat disimpan untuk mencatat eksekusi pekerjaan pengumpulan statistik. |
stats_cache_size | 500000 | Jumlah maksimum baris statistik yang dapat di-cache di sisi FE. |
statistics_simultaneously_running_task_num | 3 | Jumlah maksimum pekerjaan pengumpulan statistik asinkron yang dapat dieksekusi secara bersamaan. |
statistics_sql_mem_limit_in_bytes | 2.147.483.648 bytes (2 GiB) | Memori backend (BE) maksimum yang dapat ditempati oleh setiap pernyataan SQL untuk pengumpulan statistik. |
Tanya Jawab Umum
T: Apa yang harus saya lakukan jika kesalahan "Stats table not available..." dilaporkan setelah saya mengirimkan pernyataan ANALYZE?
J: Periksa status BE.
Anda dapat mengeksekusi pernyataan
SHOW BACKENDSuntuk memeriksa apakah status BE normal. Jika status BE normal, Anda dapat mengeksekusi pernyataanADMIN SHOW REPLICA STATUS FROM __internal_schema.[tbl_in_this_db]untuk memeriksa status tablet di database. Pastikan status semua tablet normal. Selama eksekusi pernyataan ANALYZE, statistik yang dikumpulkan ditulis ke tabel internal bernama__internal_schema.column_statistics. Sebelum eksekusi pernyataan ANALYZE, FE memeriksa status tablet tabel. Jika ada tablet yang tidak tersedia, permintaan pengumpulan statistik ditolak.T: Apa yang harus saya lakukan jika statistik gagal dikumpulkan dari tabel besar?
J: Kami sarankan Anda mengeksekusi pernyataan
ANALYZE ... WITH SAMPLE...untuk mengumpulkan statistik dari tabel besar. Sumber daya yang dapat dikonsumsi oleh pernyataan ANALYZE dibatasi secara ketat. Dalam hal ini, jika Anda mengeksekusi pernyataan ANALYZE pada tabel besar, eksekusi mungkin timeout atau dibatasi oleh memori BE yang tersedia.