Jawaban:
Haruskah saya mulai mengindeks langsung dari awal atau ketika masalah kinerja muncul?
Strategi pengindeksan cenderung berevolusi ketika pola penggunaan muncul. Yang mengatakan, ada juga strategi dan pedoman desain yang dapat diterapkan di muka.
Pilih kunci pengelompokan yang baik . Anda biasanya dapat menentukan indeks berkerumun yang sesuai pada waktu desain, berdasarkan pola yang diharapkan dari sebuah tabel. Jika kasus yang mendesak muncul untuk perubahan di masa depan, maka jadilah itu.
Buat batasan utama dan unik lainnya . Ini akan diberlakukan oleh indeks unik.
Buat kunci asing Anda dan indeks non-cluster yang terkait . Kunci asing adalah kolom gabungan yang paling sering Anda referensikan, jadi buatlah indeks dari awal.
Buat indeks untuk kueri yang sangat selektif . Untuk pola kueri yang sudah Anda ketahui akan sangat selektif dan cenderung menggunakan pencarian daripada pemindaian.
Di luar hal di atas, lakukan pendekatan bertahap dan holistik untuk menerapkan indeks baru. Secara holistik, maksud saya menilai potensi manfaat dan dampak terhadap semua pertanyaan dan indeks yang ada saat mengevaluasi penambahan.
Masalah yang tidak biasa dalam lingkaran SQL Server adalah overindexing, sebagai hasil bimbingan dari DMV indeks yang hilang dan petunjuk SSMS. Tak satu pun dari alat ini yang mengevaluasi indeks yang ada dan dengan senang hati akan menyarankan Anda membuat indeks 6 kolom baru daripada menambahkan satu kolom ke indeks 5 kolom yang ada.
-- If you have this
CREATE NONCLUSTERED INDEX [IX_MyTable_MyIndex] ON [dbo].[MyTable]
(
[col1] ASC
, [col2] ASC
, [col3] ASC
, [col4] ASC
, [col5] ASC
)
-- But your query would benefit from the addition of a column
CREATE NONCLUSTERED INDEX [IX_MyTable_MyIndex] ON [dbo].[MyTable]
(
[col1] ASC
, [col2] ASC
, [col3] ASC
, [col4] ASC
, [col5] ASC
, [col6] ASC
)
-- SSMS will suggest you create this instead
CREATE NONCLUSTERED INDEX [IX_MyTable_AnotherIndexWithTheSameColumnsAsTheExistingIndexPlusCol6] ON [dbo].[MyTable]
(
[col1] ASC
, [col2] ASC
, [col3] ASC
, [col4] ASC
, [col5] ASC
, [col6] ASC
)
Kimberly Tripp memiliki beberapa bahan yang sangat baik tentang strategi pengindeksan yang sementara SQL fokus berlaku untuk platform lain. Untuk rakyat SQL Server, ada beberapa alat praktis untuk mengidentifikasi duplikat seperti contoh di atas.
Kami juga dapat membuat indeks sementara saat menjalankan kueri. Apa pro dan kontra dari teknik seperti itu?
Ini biasanya hanya berlaku untuk kueri yang jarang dijalankan, biasanya ETL. Anda perlu menilai:
Benar-benar ada risiko yang terkait dengan kedua pendekatan:
Opsi a) Indeks dari awal, tetapi tidak sadar Anda telah membuat sejumlah indeks yang tidak pernah digunakan. Ini menambahkan beberapa overhead (paling jelas untuk query yang memodifikasi data, tetapi juga dengan optimasi pernyataan SELECT mencoba mengidentifikasi indeks terbaik).
Anda perlu mendisiplinkan diri Anda untuk mengidentifikasi indeks yang tidak lagi digunakan dan mencoba dan menghapusnya (PostgreSQL dapat melakukan ini; sayangnya MySQL dengan perbandingan sangat lemah saat ini di luar kotak.)
Opsi b) Jangan menambahkan indeks sampai orang-orang mulai mengeluh, atau alat diagnostik Anda memicu bahwa permintaan tertentu lambat dan dapat ditingkatkan.
Risiko yang Anda perkenalkan adalah Anda tidak memiliki jendela waktu yang cukup besar antara saat Anda melihat Anda membutuhkan indeks, dan ketika Anda harus menambahkannya.
PostgreSQL mendukung indeks bangunan CONCURRENTLY
, yang memang mengurangi sebagian tekanan dari persyaratan indeks-mendadak ini, tetapi ada beberapa peringatan yang dicatat dalam manual.
Opsi (b) cenderung menjadi pilihan saya, tetapi saya pikir gabungan dari kedua opsi tersebut mungkin merupakan solusi terbaik. Ini berkaitan dengan tingkat kepercayaan Anda, apakah Anda berpikir indeks akan benar-benar digunakan.
Apa yang membuat diskusi ini sangat kompleks adalah bahwa biasanya mudah untuk mengubah indeks, tetapi lebih sulit untuk mengubah skema. Saya tidak ingin mempromosikan reaksi b yang tertunda sebagai alasan untuk gegabah.
Selain jawaban Markus
Anda bisa merasakannya dengan memiliki data tes realistis pada jumlah yang diharapkan. Saya telah melihat banyak, banyak (terlalu banyak) kasus di mana kueri berjalan OK dengan 1000 baris tetapi tidak dalam jutaan produksi.
Jika Anda bisa, kerjakan salinan produksi nanti,
Tentu saja, saya telah melihat masalah aneh hanya dalam produksi karena pola penggunaan ketika yang lainnya identik
Indeks sementara? Di luar pola muat ETL, jika Anda membutuhkannya sekali Anda akan membutuhkannya lagi. Jangan lupa: indeks buat / letakkan adalah tulisan dan dicatat = muat lebih banyak
Hanya dengan menambahkan beberapa hal.
Ini pendekatan saya.
Jangan takut untuk meletakkan > 0
atau > ""
di mana klausa Anda untuk kolom yang tidak digunakan.
select * from blah
where A="one"
and B="two"
and C>="" --to match index
and D="four"
--This will use your existing index. No need to create a redundant one.
Saya akan mencoba menjawab hanya pertanyaan pertama. Jika Anda dapat memperkirakan bahkan secara kasar dari awal berapa banyak catatan yang akan Anda miliki di tabel setelah jangka waktu tertentu, daripada saya katakan lebih baik mulai dari awal untuk merancang beberapa indeks. Coba gunakan beberapa alat uji atau skrip pengujian yang akan mengotomatiskan sebanyak mungkin panggilan untuk panggilan aplikasi yang menurut Anda paling sering digunakan dan Anda akan melihat pemindaian tabel apa yang dapat dihindari sejak awal.
Ini akan menjadi pekerjaan tebakan di awal, tetapi seiring waktu, karena Anda memiliki statistik penggunaan yang tepat, Anda akan memiliki gambar yang lebih jelas.