Tidak ada yang salah dengan GUID sebagai kunci dan cluster dalam sistem OLTP (kecuali Anda memiliki BANYAK indeks di atas meja yang menderita karena peningkatan ukuran cluster). Faktanya, mereka jauh lebih dapat diukur daripada kolom IDENTITAS.
Ada kepercayaan luas bahwa GUID adalah masalah besar dalam SQL Server - sebagian besar, ini cukup salah. Faktanya, GUID dapat secara signifikan lebih terukur pada kotak dengan lebih dari sekitar 8 core:
Maaf, tetapi pengembang Anda benar. Khawatir tentang hal-hal lain sebelum Anda khawatir tentang GUID.
Oh, dan akhirnya: mengapa Anda ingin indeks cluster di tempat pertama? Jika masalah Anda adalah sistem OLTP dengan banyak indeks kecil, Anda cenderung lebih baik dengan tumpukan.
Sekarang mari kita pertimbangkan fragmentasi (yang akan diperkenalkan oleh GUID) terhadap bacaan Anda. Ada tiga masalah utama dengan fragmentasi:
- Halaman membagi disk biaya I / O
- Setengah halaman penuh tidak seefisien memori seperti halaman penuh
- Ini menyebabkan halaman disimpan tidak berurutan, yang membuat kemungkinan I / O berurutan lebih kecil
Karena kekhawatiran Anda dalam pertanyaan adalah tentang skalabilitas, yang dapat kami definisikan sebagai "Menambahkan lebih banyak perangkat keras membuat sistem berjalan lebih cepat" ini adalah masalah Anda yang paling kecil. Untuk mengatasi masing-masing secara bergantian
Iklan 1) Jika Anda ingin skala, maka Anda mampu membeli I / O. Bahkan SSD Samsung / Intel 512GB yang murah (dengan beberapa USD / GB) akan memberi Anda lebih dari 100K IOPS. Anda tidak akan memakannya dalam waktu dekat pada sistem 2 socket. Dan jika Anda harus mengalami itu, beli satu lagi dan Anda siap
Iklan 2) Jika Anda menghapus tabel Anda, Anda akan memiliki setengah halaman penuh. Dan bahkan jika Anda tidak melakukannya, memori itu murah dan untuk semua kecuali sistem OLTP terbesar - data panas harus sesuai di sana. Mencari untuk mengemas lebih banyak data ke halaman adalah sub-optimalisasi ketika Anda mencari skala.
Iklan 3) Tabel yang dibangun dari data halaman yang sering terpecah-pecah, melakukan I / O acak dengan kecepatan yang persis sama dengan tabel yang diisi secara berurutan
Sehubungan dengan bergabung, ada dua jenis bergabung utama yang Anda mungkin akan melihat dalam beban kerja seperti OLTP: Hash dan loop. Mari kita lihat satu per satu:
Hash join: Gabung hash mengasumsikan bahwa tabel kecil dipindai dan yang lebih besar biasanya dicari. Meja kecil sangat mungkin berada dalam memori, jadi I / O bukan urusan Anda di sini. Kami sudah menyentuh fakta bahwa mencari adalah biaya yang sama dalam indeks terfragmentasi seperti dalam indeks non terfragmentasi
Loop bergabung: Tabel luar akan dicari. Biaya yang sama
Anda juga mungkin memiliki banyak pemindaian tabel yang buruk terjadi - tetapi kemudian GUID sekali lagi bukan urusan Anda, pengindeksan yang tepat adalah.
Sekarang, Anda mungkin memiliki beberapa pemindaian rentang yang sah terjadi (terutama ketika bergabung dengan kunci asing) dan dalam kasus ini, data terfragmentasi kurang "dikemas" dibandingkan dengan data yang tidak terfragmentasi. Tapi mari kita pertimbangkan apa yang akan Anda lihat dalam data 3NF yang diindeks dengan baik:
Gabung dari tabel yang memiliki referensi kunci asing ke kunci utama dari tabel yang dirujuk
Sebaliknya
Iklan 1) Dalam hal ini, Anda akan mencari tunggal untuk kunci utama - bergabung dengan n ke 1. Fragmentasi atau tidak, biaya yang sama (satu pencarian)
Iklan 2) Dalam hal ini, Anda bergabung dengan kunci yang sama, tetapi dapat mengambil lebih dari satu baris (rentang pencarian). Gabung dalam hal ini adalah 1 ke n. Namun, tabel asing yang Anda cari, Anda mencari kunci SAMA, yang kemungkinan besar berada pada halaman yang sama dalam indeks terfragmentasi seperti pada yang tidak terfragmentasi.
Pertimbangkan kunci asing itu sejenak. Bahkan jika Anda memiliki sekuensial "sempurna" meletakkan kunci utama kami - apa pun yang menunjuk ke kunci itu akan tetap non berurutan.
Tentu saja, Anda mungkin menjalankan mesin virtual di beberapa SAN di beberapa bank yang harganya murah dan prosesnya tinggi. Maka semua saran ini akan hilang. Tetapi jika itu adalah dunia Anda, skalabilitas mungkin bukan yang Anda cari - Anda mencari kinerja dan kecepatan / biaya tinggi - yang merupakan dua hal yang berbeda.