GUID
s mungkin tampaknya menjadi pilihan alami untuk kunci utama Anda - dan jika Anda benar-benar harus melakukannya, Anda mungkin dapat berdebat untuk menggunakannya untuk KUNCI UTAMA tabel. Yang sangat saya sarankan untuk tidak dilakukan adalah menggunakan GUID
kolom sebagai kunci pengelompokan , yang dilakukan SQL Server secara default, kecuali jika Anda secara khusus melarangnya.
Anda benar-benar perlu memisahkan dua masalah:
-
kunci utama adalah konstruksi logis - salah satu kunci kandidat yang secara unik dan andal mengidentifikasi setiap baris dalam tabel Anda. Ini bisa apa saja, sungguh - sebuah
INT
, sebuahGUID
, sebuah string - pilih yang paling masuk akal untuk skenario Anda. -
kunci pengelompokan (kolom atau kolom yang mendefinisikan indeks berkerumun di atas meja) - ini adalah fisik hal terkait penyimpanan, dan di sini, tipe data kecil, stabil, dan terus meningkat adalah pilihan terbaik Anda -
INT
atauBIGINT
sebagai opsi default Anda.
Secara default, kunci utama pada tabel SQL Server juga digunakan sebagai kunci pengelompokan - tetapi itu tidak perlu seperti itu! Saya pribadi telah melihat peningkatan kinerja besar-besaran ketika memecah Kunci Utama / Clustered berbasis GUID sebelumnya menjadi dua kunci terpisah - kunci utama (logis) pada GUID, dan kunci pengelompokan (pemesanan) pada INT IDENTITY(1,1)
kolom.
Sebagai Kimberly Tripp - Ratu Pengindeksan - dan yang lainnya telah berkali-kali menyatakan - GUID sebagai kunci pengelompokan tidak optimal, karena karena keacakannya, ini akan menyebabkan fragmentasi halaman dan indeks yang besar dan kinerja yang umumnya buruk.
Ya, saya tahu - ada newsequentialid()
di SQL Server 2005 dan lebih tinggi - tetapi bahkan itu tidak benar-benar dan sepenuhnya berurutan dan dengan demikian juga mengalami masalah yang sama seperti GUID - hanya sedikit kurang menonjol.
Lalu ada masalah lain yang perlu dipertimbangkan:kunci pengelompokan di atas meja akan ditambahkan ke setiap entri pada setiap indeks non-cluster di meja Anda juga - jadi Anda benar-benar ingin memastikannya sekecil mungkin. Biasanya, INT dengan 2+ miliar baris seharusnya cukup untuk sebagian besar tabel - dan dibandingkan dengan GUID sebagai kunci pengelompokan, Anda dapat menghemat ratusan megabita penyimpanan pada disk dan memori server.
Perhitungan cepat - menggunakan INT
vs. GUID sebagai Kunci Utama dan Pengelompokan:
- Tabel Dasar dengan 1.000'000 baris (3,8 MB vs. 15,26 MB)
- 6 indeks tanpa cluster (22,89 MB vs. 91,55 MB)
TOTAL:25 MB vs. 106 MB - dan itu hanya di satu meja!
Beberapa bahan untuk dipikirkan - hal-hal luar biasa oleh Kimberly Tripp - baca, baca lagi, cerna! Ini adalah Injil pengindeksan SQL Server, sungguh.
- GUID sebagai PRIMARY KEY dan/atau kunci berkerumun
- Debat indeks berkerumun berlanjut
- Kunci pengelompokan yang terus meningkat - Debat Indeks Terkelompok..........lagi!
- Ruang disk murah - itu tidak intinya!