Apakah 'Hindari membuat indeks yang dikelompokkan berdasarkan kunci yang bertambah' adalah mitos dari SQL Server 2000 hari?

22

Basis data kami terdiri dari banyak tabel, sebagian besar menggunakan kunci pengganti integer sebagai kunci utama. Sekitar setengah dari kunci utama ini ada di kolom identitas.

Pengembangan basis data dimulai pada masa SQL Server 6.0.

Salah satu aturan yang diikuti sejak awal adalah, Hindari membuat indeks berkerumun berdasarkan kunci yang bertambah , seperti yang Anda temukan dalam Kiat Pengoptimalan Indeks ini .

Sekarang menggunakan SQL Server 2005 dan SQL Server 2008, saya memiliki kesan kuat bahwa keadaan berubah. Sementara itu, kolom-kolom kunci utama ini adalah kandidat pertama yang sempurna untuk indeks berkerumun tabel.

bernd_k
sumber

Jawaban:

34

Mitos kembali ke sebelum SQL Server 6.5, yang menambahkan penguncian tingkat baris . Dan diisyaratkan di sini oleh Kalen Delaney .

Itu berkaitan dengan "hot spot" penggunaan halaman data dan fakta bahwa seluruh halaman 2k (SQL Server 7 dan lebih tinggi menggunakan halaman 8k) dikunci, alih-alih baris yang dimasukkan Edit, Feb 2012

Ditemukan artikel resmi oleh Kimberly L. Tripp

"Debat Indeks Berkelompok Terus ..."

Hotspot adalah sesuatu yang sangat kami coba hindari SEBELUMNYA ke SQL Server 7.0 karena penguncian tingkat halaman (dan di sinilah istilah hot spot menjadi istilah negatif). Sebenarnya, itu tidak harus menjadi istilah negatif. Namun, karena mesin penyimpanan itu dirancang ulang / didesain ulang (dalam SQL Server 7.0) dan sekarang termasuk penguncian tingkat baris yang benar, motivasi ini (untuk menghindari hotspot) tidak lagi ada.

Edit, Mei 2013

Tautan dalam jawaban lucky7_2000 tampaknya mengatakan bahwa hotspot bisa ada dan menyebabkan masalah. Namun, artikel ini menggunakan indeks cluster non-unik di TranTime. Ini membutuhkan pengunisi ditambahkan. Yang berarti indeks tidak meningkat secara monoton (dan terlalu lebar). Tautan dalam jawaban itu tidak bertentangan dengan jawaban ini atau tautan saya

Pada tingkat pribadi, saya telah membangun database dimana saya memasukkan puluhan ribu baris per detik ke dalam tabel yang memiliki kolom IDENTITAS bigint sebagai PK berkerumun.

gbn
sumber
23

Singkatnya, dalam versi SQL Server modern kunci berkerumun pada kolom identitas adalah pilihan yang lebih disukai hari ini.

mrdenny
sumber
Singkat, sederhana, to the point jadi ini membuat +1 saya. Pastikan untuk memeriksa tautan ke SQLSkills karena ada banyak info bagus di sana.
AndrewSQL
12
Ini terdengar seperti perintah. Tidak ada penjelasan atau logika mengapa kita harus ...
gbn
Tidak hanya terdengar seperti perintah, tetapi juga salah. Setiap basis data yang mengambil jumlah sisipan / detik sangat tinggi akan mengenai masalah hotspot jika Anda menggunakan kunci berurutan.
Thomas Kejser
1
Saya katakan lebih disukai, tidak diperlukan. Untuk aplikasi normal yang merupakan 98% dari basis data di dunia, kunci berkerumun di kolom identitas berfungsi dengan baik.
mrdenny
4

periksa posting ini:

http://blogs.msdn.com/b/sqlserverfaq/archive/2010/05/27/monotonically-increasing-clustered-index-keys-can-cause-latch-contention.aspx

membuat indeks berkerumun berdasarkan pada kunci yang bertambah dapat membuat hot spot yang buruk untuk kinerja ...

lucky7_2000
sumber
1
+1 untuk memberikan tautan itu. Ada beberapa petunjuk menarik di sana. Tapi saya pikir hasilnya akan jauh lebih meyakinkan, jika dia membandingkan skenario yang diberikan dengan skenario dengan membuat indeks ccx_trantime nonclustered pada tblTransactions (TranTime) atau beberapa alternatif lain. Ingat ketika Anda menghasilkan banyak data, pasti ada cara yang efisien untuk mengambil data, Anda tidak bisa begitu saja membuang semuanya.
bernd_k
@bernd_k: ini contoh tautan yang buruk. Tabel anak memiliki kunci berkerumun tidak unik yang buruk yang memerlukan pemersatu internal
gbn
1
Coba eksperimen ini kemudian: kejser.org/boosting-insert-speed-by-generating-scalable-keys
Thomas Kejser