Mengapa basis data tidak membuat indeks sendiri secara otomatis?

32

Saya akan berpikir bahwa basis data akan cukup tahu tentang apa yang sering mereka temui dan dapat menanggapi permintaan mereka di bawah bahwa mereka dapat memutuskan untuk menambahkan indeks ke data yang sangat diminta.

Jharwood
sumber
3
Apakah mobil Anda secara otomatis memperbaiki ban kempesnya sendiri?
Kermit
11
analogi yang lebih akurat adalah apakah ECU Anda mengubah daya yang dipasok ke pompa bahan bakar untuk memperbaiki laju aliran bahan bakar / oli dan mengganti garis kotor? yang jawabannya adalah ya ..
Jharwood
11
Database sudah dapat meletakkan indeks di atas meja yang saat ini mengharuskan kita untuk memerintahkannya, mobil yang secara fisik tidak dapat mengganti ban, sampai kita membuat beberapa lengan untuk digunakan.
Jharwood
1
Mereka melakukannya - untuk kolom yang memiliki UNIQUEkendala.
dan04
8
Jika Anda Google "database self tuning" Anda akan menemukan banyak penelitian tentang ini. Mungkin di masa depan akan umum untuk memiliki beberapa elemen ini.
Martin Smith

Jawaban:

25

Memperbarui

Ini sekarang diimplementasikan dalam SQL Server Azure. Ini menghasilkan rekomendasi

masukkan deskripsi gambar di sini

dan manajemen indeks dapat dikonfigurasi untuk menjadi otomatis .

Aktifkan manajemen indeks otomatis

Anda dapat mengatur Penasihat Database SQL untuk mengimplementasikan rekomendasi secara otomatis. Ketika rekomendasi tersedia, mereka akan secara otomatis diterapkan. Seperti semua operasi indeks yang dikelola oleh layanan jika dampak kinerja negatif, rekomendasi akan dikembalikan.

Jawaban Asli

Beberapa database sudah (semacam) membuat indeks secara otomatis.

Dalam SQL Server rencana eksekusi kadang-kadang dapat menyertakan operator Index Spool di mana RDBMS secara dinamis membuat salinan data yang diindeks. Namun kumparan ini bukan merupakan bagian yang tetap dari basis data yang selaras dengan data sumber dan tidak dapat dibagi antara eksekusi kueri, yang berarti eksekusi rencana tersebut dapat berulang kali membuat dan menjatuhkan indeks sementara pada data yang sama.

Mungkin di masa depan RDBMS akan memiliki kapasitas untuk secara dinamis turun dan membuat indeks persisten sesuai dengan beban kerja.

Proses optimasi indeks pada akhirnya hanyalah analisis biaya manfaat. Meskipun benar bahwa manusia mungkin memiliki lebih banyak informasi tentang kepentingan relatif dari pertanyaan dalam beban kerja pada prinsipnya, tidak ada alasan mengapa informasi ini tidak dapat disediakan untuk pengoptimal. SQL Server sudah memiliki gubernur sumber daya yang memungkinkan sesi diklasifikasikan ke dalam kelompok beban kerja yang berbeda dengan alokasi sumber daya yang berbeda sesuai dengan prioritas.

DMV indeks yang hilang yang disebutkan oleh Kenneth tidak dimaksudkan untuk diterapkan secara membabi buta karena mereka hanya mempertimbangkan manfaat dari permintaan tertentu dan tidak berupaya memperhitungkan biaya indeks potensial untuk pertanyaan lain. Juga tidak mengkonsolidasikan indeks hilang yang serupa. misalnya keluaran DMV ini dapat melaporkan indeks yang hilang pada A,B,CdanA,B INCLUDE(C)

Beberapa masalah saat ini dengan ide tersebut

  • Kualitas setiap analisis otomatis yang tidak benar-benar membuat indeks akan sangat tergantung pada keakuratan model penetapan biaya.
  • Bahkan dalam bidang analisis otomatis, solusi offline akan dapat lebih menyeluruh daripada solusi online karena sangat penting bahwa solusi online tidak boleh menambah biaya penyimpanan buku yang besar ke server langsung dan mengganggu tujuan utamanya menjalankan query.
  • Indeks yang dibuat secara otomatis sebagai respons terhadap beban kerja tentu akan dibuat sebagai respons terhadap pertanyaan yang akan menemukan mereka berguna sehingga akan tertinggal di belakang solusi yang membuat indeks di muka.

Mungkin masuk akal untuk mengharapkan keakuratan model penetapan biaya untuk meningkat seiring waktu tetapi poin 2 terlihat lebih sulit untuk dipecahkan dan poin 3 secara inheren tidak dapat larut.

Namun demikian, mungkin sebagian besar pemasangan tidak berada dalam situasi ideal ini dengan staf terampil yang terus memantau, mendiagnosis, dan mengantisipasi (atau setidaknya bereaksi terhadap) perubahan beban kerja.

Proyek AutoAdmin di Microsoft Research telah berjalan sejak 1996

Tujuan dari proyek ini adalah untuk membuat database self-tuning dan mengatur diri sendiri dengan mengeksploitasi pengetahuan tentang beban kerja

Halaman muka proyek mencantumkan beberapa proyek menarik. Yang satu sangat relevan dengan pertanyaan di sini

Masalah lain yang menarik muncul ketika tidak ada DBA yang tersedia (misalnya database yang disematkan atau bisnis kecil). Dalam skenario seperti itu, pendekatan penyetelan indeks kontinu sentuhan rendah mungkin menjadi penting. Kami telah menjelajahi solusi ... [dalam] “ Pendekatan Online untuk Penyesuaian Desain Fisik ” di ICDE 2007.

Penulis menyatakan

Dengan fitur-fitur DBMS yang semakin umum seperti indeks online, menarik untuk mengeksplorasi lebih banyak solusi otomatis untuk masalah desain fisik yang memajukan keadaan terkini.

Makalah ini memperkenalkan algoritma

Karakteristik utamanya adalah:

  • Saat kueri dioptimalkan, kami mengidentifikasi serangkaian indeks kandidat yang relevan yang akan meningkatkan kinerja. Fitur ini memungkinkan pemrosesan kueri untuk melanjutkan secara paralel dengan indeks yang dibangun di latar belakang.
  • Pada waktu pelaksanaan, kami melacak potensi keuntungan yang kami rugi dengan tidak memiliki indeks kandidat tersebut dan juga kegunaan indeks yang ada di hadapan kueri, pembaruan, dan kendala ruang.
  • Setelah kami mengumpulkan cukup "bukti" bahwa perubahan desain fisik menguntungkan, kami secara otomatis memicu kreasi atau penghapusan indeks.
  • Sifat online dari masalah kita menyiratkan bahwa kita umumnya akan tertinggal di belakang solusi optimal yang mengetahui masa depan. Namun, dengan hati-hati mengukur bukti, kami memastikan bahwa kami tidak menderita dari keputusan "terlambat" secara signifikan, sehingga membatasi jumlah kerugian yang terjadi

Implementasi algoritma memungkinkan pelambatan dalam menanggapi perubahan beban server dan juga dapat membatalkan pembuatan indeks jika selama pembuatan perubahan beban kerja dan manfaat yang diharapkan berada di bawah titik yang dianggap berharga.

Kesimpulan dari penulis pada topik Online versus penyetelan fisik tradisional.

Algoritma online dalam pekerjaan ini berguna ketika DBA tidak yakin tentang perilaku beban kerja di masa depan, atau tidak memiliki kemungkinan melakukan analisis atau pemodelan yang komprehensif. Jika DBA memiliki informasi lengkap tentang karakteristik beban kerja, maka analisis statis dan penyebaran oleh alat yang ada (misalnya, [2, 3]) akan menjadi alternatif yang lebih baik.

Kesimpulan di sini mirip dengan yang ada di makalah lain Tuning Index-driven Autonomous Query-driven

Pendekatan kami tidak bisa mengalahkan penasihat indeks jika seluruh beban kerja diketahui sebelumnya. Namun, dalam lingkungan yang dinamis dengan perubahan dan perubahan beban kerja, pendekatan berbasis permintaan menghasilkan hasil yang lebih baik.

Martin Smith
sumber
4
Sangat berbahaya bagi karier DBA untuk mengasumsikan bahwa keahliannya tidak pernah dapat diotomatisasi. Itu membunuh karier orang-orang jaringan sekarang karena pergeseran adalah untuk pusat data yang ditentukan perangkat lunak. Sebagai DBA yang baik kita harus memimpin upaya otomatisasi.
Gayus
20

Desain indeks yang Anda tempatkan adalah sesuatu yang lebih dari seni daripada sains. RDBMS tidak cukup pintar untuk mengambil beban kerja umum dan merancang strategi pengindeksan cerdas. Terserah intervensi manusia (baca: DBA) untuk menganalisis beban kerja dan menentukan pendekatan apa yang terbaik.

Jika tidak ada penalti memiliki indeks maka itu akan menjadi pendekatan senapan untuk hanya menambahkan jumlah indeks yang tak terbatas. Tetapi karena modifikasi data (INSER, UPDAT, dan DELETES) memiliki dampak pada indeks yang diaktifkan pada tabel maka akan ada overhead variabel dari indeks ini.

Dibutuhkan desain dan strategi manusia untuk secara cerdas membuat indeks yang akan memaksimalkan kinerja membaca, sementara memiliki jumlah modifikasi data yang paling sedikit.

Thomas Stringer
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Paul White mengatakan GoFundMonica
13

Bahkan, ada beberapa database yang melakukan ini. Misalnya, Google BigTable dan SimpleDB Amazon secara otomatis membuat indeks (meskipun RDBMS) . Ada juga setidaknya satu mesin RDBMS MySQL yang melakukan ini. SQL Server juga melacak indeks yang menurutnya harus Anda buat , meskipun tidak sejauh yang sebenarnya dibuat.

Masalahnya sangat sulit untuk diperbaiki, sehingga tidak heran bahwa sebagian besar database tidak secara otomatis membuatnya (BigTable / SimpleDB lolos begitu saja karena mereka tidak mengizinkan bergabung secara sewenang-wenang, yang membuat semuanya secara signifikan lebih mudah) . Selain itu, membuat indeks dengan cepat adalah proses yang memakan waktu yang membutuhkan akses eksklusif ke seluruh tabel - jelas bukan sesuatu yang Anda inginkan terjadi saat tabel online.

Namun, mengingat jumlah aplikasi web LAMP di luar sana yang ditulis oleh amatir yang bahkan tidak tahu apa yang indeks adalah , saya masih berpikir fitur ini akan bermanfaat bagi sebagian orang.

BlueRaja - Danny Pflughoeft
sumber
4
Saya akan mengatakan bahwa membandingkan BigTable (dan turunannya, seperti Cassandra, HBase, dll) dengan solusi RDBMS adalah membandingkan apel dengan jeruk - BigTable dan turunannya lebih seperti toko kunci-nilai raksasa atau toko kolom, dan kunci baris secara inheren merupakan indeks .
Suman
1
Persis. Pertanyaan ini ditandai dengan rdbmsdan saya tidak berpikir bahwa BigTable termasuk dalam kategori.
ypercubeᵀᴹ
2
@ ypercube: ... Ya, saya sebutkan itu dalam jawaban saya; tapi masih perlu diketahui, paling tidak sebagai tempat tujuan. Saya juga beberapa menyebutkan database lain yang merupakan RDBMS ini yang melakukan hal ini, dan menjelaskan mengapa hal itu tidak umum. Ini jelas tidak layak untuk downvote ...
BlueRaja - Danny Pflughoeft
1
Saya tidak downvote. Saya setuju itu masalah yang sangat sulit.
ypercubeᵀᴹ
10

Meskipun sudah ada beberapa jawaban yang luas, mereka tampaknya mengitari jawaban yang sebenarnya: Indeks tidak selalu diinginkan.

Dengan analogi mobil yang disebutkan dalam komentar, Anda akan lebih baik mengatakan mengapa tidak semua mobil dilengkapi dengan paket olahraga ekstrim? Sebagian biayanya, tetapi juga karena banyak orang tidak membutuhkan atau menginginkan ban low profile dan suspensi keras; itu tidak perlu tidak nyaman.

Jadi mungkin Anda memiliki 1.000 bacaan untuk setiap sisipan, mengapa tidak memiliki indeks yang dibuat secara otomatis? Jika tabel luas dan kueri bervariasi, mengapa tidak memiliki beberapa? Mungkin komit adalah waktu kritis dan bacaan tidak; dalam keadaan itu mungkin tidak dapat diterima untuk memperlambat insert Anda. Mungkin Anda bekerja dengan ruang disk yang terbatas dan Anda tidak mampu memiliki indeks tambahan yang memakan ruang yang Anda punya.

Intinya, indeks tidak secara otomatis dibuat karena mereka bukan jawaban untuk segalanya. Merancang indeks bukan hanya sekedar perkataan "hei ini akan mempercepat bacaan saya", ada faktor lain yang perlu dipertimbangkan.

Mat
sumber
1
+1 walaupun tentu saja mungkin dan layak untuk mengotomatiskan hal-hal ini, kami tidak selalu akan lebih baik dengan sekelompok indeks ajaib yang diterapkan oleh sistem yang tidak memiliki wawasan tentang bagaimana data akan digunakan besok, apalagi tulisan Anda vs. ambang batas trade-off baca. Saya ngeblog sedikit tentang hal ini tempo hari , tapi jelas ada banyak lagi untuk dibicarakan.
Aaron Bertrand
> Mungkin komit kritis terhadap waktu dan bacaan tidak; dalam keadaan itu mungkin tidak dapat diterima untuk memperlambat insert Anda. Jawaban yang bagus, sangat membantu.
Siddhartha
6

Mereka dapat menganalisis permintaan sebelumnya dan menyarankan / membuat indeks namun ini tidak bekerja secara optimal karena indeks mencapai keseimbangan untuk mempercepat apa yang Anda inginkan dioptimalkan dengan biaya dan server tidak dapat mengetahui niat Anda.

JamesRyan
sumber
-4

Mereka tidak pintar, mereka adalah sepotong kode. Setiap kali Anda memasukkan data baru ke basis data, ia perlu menemukan lokasi baru untuk itu dan peta untuk menemukannya saat diminta. Pengindeksan terdengar lebih mudah daripada itu, Anda hanya memberikan nomor baru ke sepotong data baru? Nah, bagaimana kalau kueri berikutnya bukan tentang potongan data terakhir tetapi sekitar 36.271 potongan sebelumnya? Anda dapat dengan mudah menemukannya dengan indeks Anda, bukan? Tetapi bagaimana jika kueri menyertakan kata seperti "memancing" yang dapat ditemukan di potongan 36271 tua yang dibuat pada tahun 1997? Ho? Tidak sepatah kata pun tentang memancing di artikel lama.

Jika data datang ke database satu per satu, itu bisa diindeks seperti itu. Tetapi pengindeksan sederhana akan membuat Anda salah hasil dan / atau memperlambat kinerja cepat atau lambat ...

Niko Kiiskinen
sumber