Saya telah memutuskan untuk menggali sedikit pada pertanyaan ini dan saya menemukan beberapa dokumen menarik berbicara tentang bagaimana dan kapan menggunakan atau mungkin lebih baik, bukan (memaksa) penggunaan indeks non-cluster.
Seperti yang disarankan per komentar oleh John Eisbrener , salah satu yang paling direferensikan, bahkan di blog lain, adalah artikel yang menarik dari Kimberly L. Tripp:
tetapi ini bukan satu-satunya, jika Anda tertarik, Anda dapat melihat halaman ini:
Seperti yang Anda lihat, semuanya bergerak di sekitar konsep titik kritis .
Dikutip dari artikel KL Tripp
Apa titik kritisnya?
Ini adalah titik di mana jumlah baris yang dikembalikan adalah " tidak lagi cukup selektif ". SQL Server memilih untuk TIDAK menggunakan indeks non-cluster untuk mencari baris data yang sesuai dan melakukan pemindaian tabel.
Ketika SQL Server menggunakan indeks non-clustered pada heap, pada dasarnya ia mendapatkan daftar pointer ke halaman-halaman tabel dasar. Kemudian menggunakan pointer ini untuk mengambil baris dengan serangkaian operasi yang disebut Row ID Lookups (RID). Ini berarti bahwa setidaknya, ia akan menggunakan halaman yang dibaca sebanyak jumlah baris yang dikembalikan, dan mungkin lebih banyak lagi. Prosesnya agak mirip dengan indeks berkerumun sebagai tabel dasar, dengan hasil yang sama: lebih banyak dibaca.
Tapi, kapan titik kritis itu terjadi?
Tentu saja karena kebanyakan hal dalam hidup ini, itu tergantung ...
Tidak serius, ini terjadi antara 25% dan 33% dari jumlah halaman dalam tabel, tergantung pada berapa banyak baris per halaman. Tetapi ada lebih banyak faktor yang harus Anda pertimbangkan:
Dikutip dari artikel ITPRoToday
Faktor-Faktor Lain yang Mempengaruhi Tipping Point Meskipun biaya pencarian RID adalah faktor paling penting yang mempengaruhi titik kritis, ada sejumlah faktor lain:
- I / O Fisik jauh lebih efisien saat memindai indeks berkerumun. Data indeks yang dikelompokkan ditempatkan secara berurutan pada disk dalam urutan indeks. Akibatnya, ada sedikit perjalanan lateral head pada disk, yang meningkatkan kinerja I / O.
- Ketika mesin basis data memindai indeks berkerumun, ia tahu bahwa ada kemungkinan besar bahwa beberapa halaman berikutnya pada trek disk masih akan berisi data yang dibutuhkan. Jadi, itu mulai membaca di 64KB potongan daripada halaman 8KB normal. Ini juga menghasilkan I / O yang lebih cepat.
Sekarang jika saya menjalankan pertanyaan saya lagi menggunakan statistik IO:
SET STATISTICS IO ON;
SELECT id, foo, bar, nki FROM my_table WHERE nki < 20000 ORDER BY nki ;
SET STATISTICS IO OFF;
Logical reads: 312
SET STATISTICS IO ON;
SELECT id, foo, bar, nki FROM my_table WITH(INDEX(IX_my_TABLE));
SET STATISTICS IO OFF;
Logical reads: 41293
Kueri kedua membutuhkan lebih banyak bacaan logis daripada yang pertama.
Haruskah saya menghindari indeks non-cluster?
Tidak, indeks berkerumun dapat berguna, tetapi layak untuk mengambil waktu dan melakukan upaya ekstra menganalisis apa yang ingin Anda capai dengannya.
Dikutip dari artikel KL Tripp
Jadi, apa yang harus kamu lakukan? Tergantung. Jika Anda tahu data Anda dengan baik dan Anda melakukan beberapa pengujian ekstensif Anda mungkin mempertimbangkan untuk menggunakan petunjuk (ada beberapa hal pintar yang dapat Anda lakukan secara terprogram dalam sps, saya akan mencoba dan mendedikasikan posting untuk ini segera). Namun, pilihan yang jauh lebih baik (jika memungkinkan) adalah mempertimbangkan untuk menutupi (itu benar-benar poin utama saya :). Dalam pertanyaan saya, sampul tidak realistis karena pertanyaan saya ingin semua kolom (SELECT jahat *) tetapi, jika pertanyaan Anda lebih sempit DAN mereka prioritas tinggi, Anda lebih baik dengan indeks penutup (dalam banyak kasus) melalui petunjuk karena indeks yang mencakup kueri, tidak pernah kiat.
Itulah jawaban untuk teka-teki untuk saat ini, tetapi pasti ada lebih banyak hal untuk diselami. Tipping Point bisa menjadi hal yang sangat bagus - dan biasanya bekerja dengan baik. Tetapi, jika Anda menemukan bahwa Anda dapat memaksakan indeks dan mendapatkan kinerja yang lebih baik, Anda mungkin ingin melakukan investigasi dan melihat apakah ini. Kemudian pertimbangkan seberapa besar kemungkinan sebuah petunjuk dapat membantu dan sekarang Anda tahu di mana Anda bisa fokus.