Pertanyaannya bukan 'kapan PK harus NC', tetapi Anda harus bertanya 'apa kunci yang tepat untuk indeks berkerumun'?
Dan jawabannya sangat tergantung pada bagaimana Anda meminta data . Indeks berkerumun memiliki keunggulan dibandingkan semua indeks lain: karena selalu mencakup semua kolom, selalu mencakup. Oleh karena itu pertanyaan yang dapat memanfaatkan indeks berkerumun tentu tidak perlu menggunakan pencarian untuk memenuhi beberapa kolom yang diproyeksikan dan / atau predikat.
Bagian lain dari teka-teki adalah bagaimana indeks dapat digunakan ? Ada tiga pola khas:
- probe, ketika nilai kunci tunggal dicari dalam indeks
- rentang pemindaian, ketika rentang nilai kunci diambil
- memesan dengan persyaratan, ketika indeks dapat memenuhi pesanan dengan w / o membutuhkan semacam stop-and-go
Jadi, jika Anda menganalisis beban yang diharapkan (kueri) dan menemukan bahwa sejumlah besar kueri akan menggunakan indeks tertentu karena mereka menggunakan pola akses tertentu yang diuntungkan dari indeks, masuk akal untuk mengajukan indeks itu sebagai indeks berkerumun.
Namun faktor lain adalah bahwa kunci indeks berkerumun adalah kunci pencarian yang digunakan oleh semua indeks yang tidak berkerumun dan karena itu kunci indeks berkerumun luas menciptakan efek riak dan memperluas semua indeks yang tidak berkerumun dan indeks lebar berarti lebih banyak halaman, lebih banyak I / O , lebih banyak memori, lebih sedikit kebaikan.
Indeks berkerumun yang baik stabil , itu tidak berubah selama masa entitas, karena perubahan nilai kunci indeks berkerumun berarti baris harus dihapus dan dimasukkan kembali.
Dan indeks berkerumun yang baik tumbuh agar tidak secara acak (setiap nilai kunci yang baru dimasukkan lebih besar dari nilai sebelumnya) untuk menghindari pemisahan halaman dan fragmentasi (tanpa bermain-main dengan FILLFACTOR
s).
Jadi sekarang kita tahu apa kunci indeks berkerumun yang baik, apakah kunci utama (yang merupakan properti logis pemodelan data) cocok dengan persyaratan? Jika ya, maka PK harus dikelompokkan. Jika tidak, maka PK harus non-cluster.
Untuk memberikan contoh, pertimbangkan tabel fakta penjualan. Setiap entri memiliki ID yang merupakan kunci utama. Tetapi sebagian besar pertanyaan meminta data antara tanggal dan tanggal lain, oleh karena itu kunci indeks terkluster terbaik adalah tanggal penjualan , bukan ID . Contoh lain dari memiliki indeks pengelompokan berbeda dari kunci primer adalah kunci selektivitas yang sangat rendah, seperti 'kategori', atau 'keadaan', kunci dengan hanya beberapa nilai berbeda. Memiliki kunci indeks berkerumun dengan kunci selektivitas rendah ini sebagai kunci paling kiri, misalnya (state, id)
, sering masuk akal karena pemindaian rentang yang mencari semua entri dalam 'keadaan' tertentu.
Satu catatan terakhir tentang kemungkinan kunci primer non-cluster di atas heap (yaitu tidak ada indeks cluster sama sekali). Ini mungkin skenario yang valid, alasan khasnya adalah ketika kinerja penyisipan massal sangat penting, karena tumpukan memiliki throughput penyisipan massal yang jauh lebih baik bila dibandingkan dengan indeks yang dikelompokkan.