Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Penyetelan indeks adalah fitur di instans server fleksibel Azure Database for PostgreSQL Anda yang secara otomatis meningkatkan performa beban kerja Anda dengan menganalisis kueri yang dilacak dan memberikan rekomendasi indeks.
Ini adalah penawaran bawaan di instans server fleksibel Azure Database for PostgreSQL Anda, yang dibangun di atas performa Monitor dengan fungsionalitas penyimpanan kueri. Penyetelan indeks menganalisis beban kerja yang dilacak oleh penyimpanan kueri, dan menghasilkan rekomendasi indeks untuk meningkatkan performa beban kerja yang dianalisis atau untuk menghilangkan indeks duplikat atau tidak digunakan.
- Identifikasi indeks mana yang bermanfaat untuk dibuat karena dapat secara signifikan meningkatkan kueri yang dianalisis selama sesi penyetelan indeks.
- Identifikasi indeks yang merupakan duplikat yang tepat dan dapat dihilangkan untuk mengurangi dampak performa keberadaan dan pemeliharaan mereka pada performa sistem secara keseluruhan.
- Identifikasi indeks yang tidak digunakan dalam periode yang dapat dikonfigurasi yang dapat menjadi kandidat untuk dihilangkan.
Deskripsi umum algoritma penyetelan indeks
Ketika parameter server dikonfigurasi index_tuning.mode ke report, sesi penyetelan secara otomatis dimulai dengan frekuensi yang dikonfigurasi dalam parameter index_tuning.analysis_intervalserver , dinyatakan dalam hitungan menit.
Pada fase pertama, sesi penyetelan mencari daftar database di mana ia mempertimbangkan bahwa rekomendasi apa pun yang mungkin dihasilkannya dapat berdampak signifikan pada performa keseluruhan sistem. Untuk melakukannya, ini mengumpulkan semua kueri yang direkam oleh penyimpanan kueri yang eksekusinya diambil dalam interval pencarian yang difokuskan sesi penyetelan ini. Interval pencarian saat ini mencakup hingga menit-menit terakhir index_tuning.analysis_interval , dari waktu mulai sesi penyetelan.
Untuk semua kueri yang dimulai pengguna dengan eksekusi yang direkam di penyimpanan kueri dan yang statistik runtime-nya tidak diatur ulang, sistem memberi peringkat berdasarkan total waktu eksekusi agregat mereka. Ini memfokuskan perhatiannya pada kueri yang paling menonjol, berdasarkan durasinya.
Kueri berikut dikecualikan dari daftar tersebut:
- Kueri yang dimulai sistem. (yaitu, kueri yang dijalankan oleh
azuresuperan) - Kueri dijalankan dalam konteks database sistem apa pun (
azure_sys, ,template0template1, danazure_maintenance).
Algoritma berulang di atas database target, mencari kemungkinan indeks yang dapat meningkatkan performa beban kerja yang dianalisis. Ini juga mencari indeks yang dapat dihilangkan karena diidentifikasi sebagai duplikat atau tidak digunakan untuk jangka waktu yang dapat dikonfigurasi.
REKOMENDASI CREATE INDEX
Untuk setiap database yang diidentifikasi sebagai kandidat yang akan dianalisis untuk menghasilkan rekomendasi indeks, semua kueri SELECT, UPDATE, INSERT, dan DELETE yang dijalankan selama interval pencarian dan dalam konteks database tertentu tersebut diperhitungkan.
Kumpulan kueri yang dihasilkan diberi peringkat berdasarkan total waktu eksekusi agregatnya, dan bagian atas index_tuning.max_queries_per_database dianalisis untuk kemungkinan rekomendasi indeks.
Rekomendasi potensial bertujuan untuk meningkatkan performa jenis kueri ini:
- Kueri dengan filter (yaitu, kueri dengan predikat dalam klausa WHERE),
- Kueri yang bergabung dengan beberapa hubungan, apakah mereka mengikuti sintaks di mana gabungan dinyatakan dengan klausa JOIN atau apakah predikat gabungan dinyatakan dalam klausa WHERE.
- Kueri menggabungkan filter dan menggabungkan predikat.
- Kueri dengan pengelompokan (kueri dengan klausa GROUP BY).
- Kueri menggabungkan filter dan pengelompokan.
- Kueri dengan pengurutan (kueri dengan klausa ORDER BY).
- Kueri menggabungkan filter dan pengurutan.
Catatan
Satu-satunya jenis indeks yang direkomendasikan sistem saat ini adalah jenis B-Tree.
Jika kueri mereferensikan satu kolom tabel dan tabel tersebut tidak memiliki statistik, kueri tersebut melewati seluruh kueri dan tidak menghasilkan rekomendasi indeks apa pun untuk meningkatkan eksekusinya.
Analisis yang diperlukan untuk mengumpulkan statistik dapat dipicu secara manual menggunakan perintah ANALYZE atau secara otomatis oleh daemon autovacuum.
index_tuning.max_indexes_per_table menentukan jumlah indeks yang dapat direkomendasikan, tidak termasuk indeks apa pun yang mungkin sudah ada pada tabel untuk tabel tunggal apa pun yang direferensikan oleh sejumlah kueri selama sesi penyetelan.
index_tuning.max_index_count menentukan jumlah rekomendasi indeks yang dihasilkan untuk semua tabel database apa pun yang dianalisis selama sesi penyetelan.
Agar rekomendasi indeks dipancarkan, mesin penyetelan harus memperkirakan bahwa ia meningkatkan setidaknya satu kueri dalam beban kerja yang dianalisis oleh faktor yang ditentukan dengan index_tuning.min_improvement_factor.
Demikian juga, semua rekomendasi indeks diperiksa untuk memastikan bahwa mereka tidak memperkenalkan regresi pada kueri tunggal dalam beban kerja faktor yang ditentukan dengan index_tuning.max_regression_factor.
Catatan
index_tuning.min_improvement_factor dan index_tuning.max_regression_factor keduanya mengacu pada biaya rencana kueri, bukan ke durasinya atau sumber daya yang mereka konsumsi selama eksekusi.
Semua parameter yang disebutkan dalam paragraf sebelumnya, nilai default dan rentang yang valid dijelaskan dalam opsi konfigurasi.
Skrip yang diproduksi bersama dengan rekomendasi untuk membuat indeks, mengikuti pola ini:
create index concurrently {indexName} on {schema}.{table}({column_name}[, ...])
Ini termasuk klausul concurrently. Untuk informasi lebih lanjut tentang efek klausul ini, kunjungi dokumentasi resmi PostgreSQL untuk CREATE INDEX.
Penyetelan indeks secara otomatis menghasilkan nama indeks yang direkomendasikan, yang biasanya terdiri dari nama kolom kunci yang berbeda yang dipisahkan oleh "_" (garis bawah) dan dengan akhiran "_idx" konstanta. Jika panjang total nama melebihi batas PostgreSQL atau jika berbenturan dengan hubungan yang ada, namanya sedikit berbeda. Ini bisa dipotong, dan angka dapat ditambahkan ke akhir nama.
Menghitung dampak rekomendasi CREATE INDEX
Dampak pembuatan rekomendasi indeks diukur pada IndexSize (megabyte) dan QueryCostImprovement (persentase).
IndexSize adalah nilai tunggal yang mewakili perkiraan ukuran indeks, mengingat kardinalitas tabel saat ini dan ukuran kolom yang direferensikan oleh indeks yang direkomendasikan.
QueryCostImprovement terdiri dari array nilai, di mana setiap elemen mewakili peningkatan biaya paket untuk setiap kueri yang biaya paketnya diperkirakan meningkat jika indeks ini ada. Setiap elemen menunjukkan pengidentifikasi kueri (dikueri) dan persentase di mana biaya paket akan meningkat jika rekomendasi diimplementasikan (dimensi).
Rekomendasi DROP INDEX dan REINDEX
Untuk setiap database yang fungsionalitas penyetelan indeksnya ditentukan, itu harus memulai sesi baru, dan setelah fase rekomendasi CREATE INDEX selesai, merekomendasikan untuk menghilangkan atau mengindeks ulang indeks yang ada, berdasarkan kriteria berikut:
- Hilangkan jika dianggap duplikat orang lain.
- Hilangkan jika tidak digunakan untuk jumlah waktu yang dapat dikonfigurasi.
- Indeks indeks indeks ulang yang ditandai sebagai tidak valid.
Menghilangkan indeks duplikat
Rekomendasi untuk menghilangkan indeks duplikat: Pertama, identifikasi indeks mana yang memiliki duplikat.
Duplikat diberi peringkat berdasarkan berbagai fungsi yang dapat dikaitkan dengan indeks dan berdasarkan perkiraan ukurannya.
Akhirnya, merekomendasikan untuk menjatuhkan semua duplikat dengan peringkat yang lebih rendah daripada pemimpin referensinya dan menjelaskan mengapa setiap duplikat diberi peringkat seperti itu.
Agar dua indeks dianggap duplikat, mereka harus:
- Dibuat di atas tabel yang sama.
- Jadilah indeks dengan jenis yang sama persis.
- Cocokkan kolom kuncinya dan, untuk kunci indeks multikolom, cocok dengan urutan referensinya.
- Cocokkan pohon ekspresi predikatnya. Hanya berlaku untuk indeks parsial.
- Cocokkan pohon ekspresi dari semua referensi kolom nonsimple. Hanya berlaku untuk indeks yang dibuat pada ekspresi.
- Cocokkan kolatasi setiap kolom yang dirujuk dalam kunci.
Menghilangkan indeks yang tidak digunakan
Rekomendasi untuk menghilangkan indeks yang tidak digunakan mengidentifikasi indeks tersebut yang:
- Tidak digunakan setidaknya
index_tuning.unused_min_periodselama beberapa hari. - Tampilkan jumlah MINIMUM (rata-rata harian
index_tuning.unused_dml_per_table) DML pada tabel tempat indeks dibuat. - Perlihatkan jumlah pembacaan minimum (rata-rata harian
index_tuning.unused_reads_per_table) pada tabel tempat indeks dibuat.
Indeks tidak valid reindeks
Rekomendasi untuk indeks yang ada mengindeks ulang mengidentifikasi indeks tersebut yang ditandai sebagai tidak valid. Untuk mempelajari selengkapnya tentang mengapa dan kapan indeks ditandai sebagai tidak valid, lihat dokumentasi resmi REINDEX di PostgreSQL.
Menghitung dampak rekomendasi DROP INDEX
Dampak rekomendasi indeks penurunan diukur pada dua dimensi: Manfaat (persentase) dan IndexSize (megabyte).
Manfaatnya adalah nilai tunggal yang dapat diabaikan untuk saat ini.
IndexSize adalah nilai tunggal yang mewakili perkiraan ukuran indeks, mengingat kardinalitas tabel saat ini dan ukuran kolom yang direferensikan oleh indeks yang direkomendasikan.
Mengonfigurasi penyetelan indeks
Penyetelan indeks dapat diaktifkan, dinonaktifkan, dan dikonfigurasi melalui serangkaian parameter yang mengontrol perilakunya.
Saat penyetelan indeks diaktifkan, ia bangun dengan frekuensi yang dikonfigurasi dalam index_tuning.analysis_interval parameter server (default hingga 720 menit atau 12 jam) dan mulai menganalisis beban kerja yang direkam oleh penyimpanan kueri selama periode tersebut.
Perhatikan bahwa jika Anda mengubah nilai untuk index_tuning.analysis_interval, nilai tersebut hanya diamati setelah eksekusi terjadwal berikutnya selesai. Jadi, misalnya, jika Anda mengaktifkan penyetelan indeks satu hari pada pukul 10:00, karena nilai default untuk index_tuning.analysis_interval adalah 720 menit, eksekusi pertama dijadwalkan dimulai pada pukul 22:00 pada hari yang sama. Setiap perubahan yang Anda buat pada nilai index_tuning.analysis_interval antara pukul 10:00 sampai 22:00 tidak akan memengaruhi jadwal awal tersebut. Hanya ketika eksekusi terjadwal selesai, eksekusi akan membaca nilai saat ini yang ditetapkan untuk index_tuning.analysis_interval dan akan menjadwalkan eksekusi berikutnya sesuai dengan nilai tersebut.
Opsi berikut tersedia untuk mengonfigurasi parameter penyetelan indeks:
| Parameter | Deskripsi | Default | Rentang | Unit |
|---|---|---|---|---|
index_tuning.analysis_interval |
Mengatur frekuensi di mana setiap sesi pengoptimalan indeks dipicu saat index_tuning.mode diatur ke REPORT. |
720 |
60 - 10080 |
Menit |
index_tuning.max_columns_per_index |
Jumlah maksimum kolom yang dapat menjadi bagian dari kunci indeks untuk indeks yang direkomendasikan. | 2 |
1 - 10 |
|
index_tuning.max_index_count |
Indeks maksimum yang direkomendasikan untuk setiap database selama satu sesi pengoptimalan. | 10 |
1 - 25 |
|
index_tuning.max_indexes_per_table |
Jumlah maksimum indeks yang dapat direkomendasikan untuk setiap tabel. | 10 |
1 - 25 |
|
index_tuning.max_queries_per_database |
Jumlah kueri terlambat per database yang indeksnya dapat direkomendasikan. | 25 |
5 - 100 |
|
index_tuning.max_regression_factor |
Regresi yang dapat diterima diperkenalkan oleh indeks yang direkomendasikan pada salah satu kueri yang dianalisis selama satu sesi pengoptimalan. | 0.1 |
0.05 - 0.2 |
Persentase |
index_tuning.max_total_size_factor |
Ukuran total maksimum, dalam persentase total ruang disk, yang dapat digunakan oleh semua indeks yang direkomendasikan untuk database tertentu. | 0.1 |
0 - 1 |
Persentase |
index_tuning.min_improvement_factor |
Peningkatan biaya yang harus diberikan indeks yang direkomendasikan untuk setidaknya salah satu kueri yang dianalisis selama satu sesi pengoptimalan. | 0.2 |
0 - 20 |
Persentase |
index_tuning.mode |
Mengonfigurasi pengoptimalan indeks sebagai dinonaktifkan (OFF) atau diaktifkan hanya untuk mengeluarkan rekomendasi. Mengharuskan penyimpanan kueri diaktifkan dengan mengatur pg_qs.query_capture_mode ke TOP atau ALL. |
OFF |
OFF, REPORT |
|
index_tuning.unused_dml_per_table |
Jumlah minimum operasi DML rata-rata harian yang memengaruhi tabel, sehingga indeks yang tidak digunakan dipertimbangkan untuk dihilangkan. | 1000 |
0 - 9999999 |
|
index_tuning.unused_min_period |
Jumlah hari minimum indeks belum digunakan, berdasarkan statistik sistem, sehingga dianggap untuk menjatuhkan. | 35 |
30 - 70 |
|
index_tuning.unused_reads_per_table |
Jumlah minimum operasi baca rata-rata harian yang memengaruhi tabel sehingga indeks yang tidak digunakan dipertimbangkan untuk menjatuhkan. | 1000 |
0 - 9999999 |
Jika Anda menggunakan perintah az postgres flexible-server index-tuning show-settings CLI dan az postgres flexible-server index-tuning set-settings untuk menampilkan atau mengubah salah satu pengaturan penyetelan indeks, nilai yang diterima sebagai argumen untuk --name parameter adalah yang ditampilkan di kolom Parameter tabel sebelumnya, tetapi tanpa menyertakan awalan index_tuning..
Informasi yang dihasilkan oleh penyetelan indeks
Cara membaca, menginterpretasikan, dan menggunakan rekomendasi yang dihasilkan oleh penyetelan indeks menjelaskan secara rinci cara mendapatkan dan menggunakan rekomendasi yang dihasilkan oleh penyetelan indeks.
Batasan dan dukungan
Berikut ini adalah daftar batasan dan cakupan dukungan untuk penyetelan indeks.
Penghapusan otomatis rekomendasi
Rekomendasi dihapus secara otomatis 35 hari setelah terakhir kali diproduksi. Agar mekanisme penghapusan otomatis ini berfungsi, penyetelan indeks harus diaktifkan.
Dependensi pada ekstensi hipopg
Agar penyetelan indeks menghasilkan rekomendasi CREATE INDEX, ia menggunakan ekstensi hipopg .
Jika ekstensi sudah ada ketika sesi penyetelan dimulai, ekstensi tersebut digunakan pada skema tempatnya dibuat. Dan ketika sesi penyetelan selesai, ekstensi tidak dihilangkan. Pengecualian untuk ini adalah jika ekstensi dibuat dalam pg_catalog skema. Jika demikian, penyetelan indeks akan menghilangkan ekstensi.
Jika ekstensi tidak ada di tempat pertama atau kami menjatuhkannya karena dibuat dalam pg_catalog skema, penyetelan indeks akan membuatnya di bawah skema yang disebut ms_temp_recommendations709253 dan, ketika sesi penyetelan berhasil diselesaikan, itu menghilangkan ekstensi dan menghapus skema.
Pengguna yang merupakan anggota azure_pg_admin peran dapat menghilangkan ekstensi hipopg kapan saja, bahkan ketika dibuat oleh fitur penyetelan indeks. Namun, menghilangkannya saat sesi penyetelan indeks berjalan dapat menyebabkan sesi tersebut gagal dan tidak menghasilkan rekomendasi apa pun.
Tingkat komputasi dan SKU yang didukung
Penyetelan indeks didukung pada semua tingkatan yang tersedia saat ini: Burstable, General Purpose, dan Memory Optimized, dan pada SKU komputasi yang saat ini didukung dengan setidaknya 4 vCore.
Versi PostgreSQL yang didukung
Penyetelan indeks didukung pada instans server fleksibel Azure Database for PostgreSQL versi utama12 atau yang lebih tinggi .
Penggunaan search_path
Penyetelan indeks menggunakan nilai yang bertahan di kolom search_pathquery_store.qs_view, sehingga ketika setiap kueri dianalisis, nilai search_path yang sama yang ditetapkan ketika kueri yang dijalankan awalnya adalah yang diatur untuk menganalisis kemungkinan rekomendasi.
Kueri berparameter
Kueri berparameter yang dibuat dengan PREPARE atau menggunakan protokol kueri yang diperluas diurai dan dianalisis untuk menghasilkan rekomendasi indeks pada kueri tersebut.
Untuk analisis kueri berparameter, penyetelan indeks mengharuskan pg_qs.parameters_capture_mode diatur ke capture_first_sample saat penyimpanan kueri mengambil eksekusi kueri. Ini juga mengharuskan parameter ditangkap dengan benar oleh penyimpanan kueri saat kueri dijalankan. Dengan kata lain, untuk kueri yang dianalisis, query_store.qs_view harus mengatur kolomnya parameters_capture_status ke succeeded.
Mode baca-saja dan replika baca
Karena penyetelan indeks bergantung pada penyimpanan kueri, yang tidak didukung dalam replika baca atau ketika instans dalam mode baca-saja, kami tidak mendukungnya pada replika baca atau pada instans yang berada dalam mode baca-saja.
Setiap rekomendasi yang terlihat pada replika baca diproduksi pada replika utama setelah menganalisis secara eksklusif beban kerja yang dijalankan pada replika utama.
Menurunkan skala komputasi
Jika penyetelan indeks diaktifkan di server, dan Anda menurunkan skala komputasi server tersebut menjadi kurang dari jumlah minimum vCore yang diperlukan, fitur tetap diaktifkan. Karena fitur ini tidak didukung pada server dengan kurang dari 4 vCore, fitur ini tidak berjalan untuk menganalisis beban kerja dan menghasilkan rekomendasi, bahkan jika index_tuning.mode diatur ke ON saat komputasi diturunkan. Meskipun server tidak memenuhi persyaratan minimum, semua index_tuning.* parameter server tidak dapat diakses. Setiap kali Anda menskalakan server Anda kembali ke komputasi yang memenuhi persyaratan minimum, index_tuning.mode dikonfigurasi dengan nilai apa pun yang ditetapkan sebelum Anda menurunkan skalanya ke komputasi yang tidak memenuhi persyaratan.
Ketersediaan tinggi dan replika baca
Jika Anda memiliki ketersediaan tinggi atau replika baca yang dikonfigurasi di server Anda, ketahui implikasi yang terkait dengan memproduksi beban kerja intensif tulis di server utama saat menerapkan indeks yang direkomendasikan. Berhati-hatilah saat membuat indeks yang ukurannya diperkirakan besar.
Alasan mengapa penyetelan indeks mungkin tidak menghasilkan rekomendasi indeks buat untuk kueri tertentu
Berikut ini adalah daftar jenis kueri yang penyetelan indeksnya tidak akan menghasilkan rekomendasi CREATE INDEX. Yang:
- Mengalami kesalahan saat mesin penyetelan indeks mencoba mendapatkan output EXPLAIN selama fase analisis.
- Tabel referensi yang tidak memiliki statistik tentang kontennya di katalog sistem pg_statistic. Jalankan ANALYZE pada tabel tersebut sehingga mesin penyetelan dapat mempertimbangkan kueri ini di masa mendatang.
- Membuat teks kueri terpotong di penyimpanan kueri. Itulah kasus ketika panjang teks kueri melebihi nilai yang dikonfigurasi dalam pg_qs.max_query_text_length.
- Objek referensi yang dihilangkan atau diganti namanya sebelum analisis terjadi. Kueri ini masih bisa valid secara sintetis, tetapi tidak valid secara semantik.
- Akses tabel atau indeks sementara pada tabel sementara.
- Mengakses tampilan atau tampilan materialisasi.
- Mengakses tabel yang dipartisi.
- Diidentifikasi sebagai pernyataan utilitas. Pernyataan utilitas atau perintah utilitas adalah, pada dasarnya, pernyataan apa pun yang tidak dianggap SELECT, INSERT, UPDATE, DELETE, atau MERGE, dan perintah tertentu yang berisi salah satu dari ini.
- Tidak termasuk index_tuning.max _queries_per_database teratas paling lambat, untuk database dan periode yang dianalisis.
- Dijalankan dalam konteks satu database tertentu, ketika tidak ada kueri tersebut yang diidentifikasi sebagai yang paling lambat teratas di tingkat server.