Saya memiliki aplikasi yang menggunakan GUID sebagai Kunci Utama di hampir semua tabel dan saya telah membaca bahwa ada masalah tentang kinerja saat menggunakan GUID sebagai Kunci Utama. Jujur, saya belum melihat masalah, tapi saya akan memulai aplikasi baru dan saya masih ingin menggunakan GUID sebagai Kunci Utama, tapi saya berpikir untuk menggunakan Kunci Utama Komposit (GUID dan mungkin bidang lain .)
Saya menggunakan GUID karena mereka bagus dan mudah dikelola ketika Anda memiliki lingkungan yang berbeda seperti "produksi", "tes" dan "dev" database, dan juga untuk data migrasi antar database.
Saya akan menggunakan Entity Framework 4.3 dan saya ingin menetapkan Guid dalam kode aplikasi, sebelum memasukkannya ke dalam database. (Yaitu saya tidak ingin membiarkan SQL menghasilkan Guid).
Apa praktik terbaik untuk membuat Kunci Utama berbasis GUID, untuk menghindari dugaan kinerja yang terkait dengan pendekatan ini?
Jawaban:
GUIDs tampaknya menjadi pilihan alami untuk kunci utama Anda - dan jika Anda benar-benar harus melakukannya, Anda mungkin bisa berdebat untuk menggunakannya untuk KUNCI UTAMA tabel. Apa yang saya sangat menyarankan untuk tidak lakukan adalah menggunakan kolom GUID sebagai kunci pengelompokan , yang SQL Server lakukan secara default, kecuali jika Anda secara khusus mengatakannya untuk tidak melakukannya.
Anda benar-benar harus memisahkan dua masalah:
yang kunci utama adalah membangun logis - salah satu kunci kandidat yang unik dan terpercaya mengidentifikasi setiap baris dalam tabel Anda. Ini bisa apa saja, benar-benar - sebuah
INT
, sebuahGUID
, string - pilih apa yang paling masuk akal untuk skenario Anda.yang kunci pengelompokan (kolom atau kolom yang mendefinisikan "indeks berkerumun" di atas meja) - ini adalah fisik hal penyimpanan-terkait, dan di sini, sebuah, stabil, terus meningkat tipe data kecil adalah memilih yang terbaik Anda -
INT
atauBIGINT
sebagai Anda pilihan standar.Secara default, kunci utama pada tabel SQL Server juga digunakan sebagai kunci pengelompokan - tetapi itu tidak harus seperti itu! Saya pribadi telah melihat keuntungan kinerja besar ketika memecah Primer / Clustered Key berbasis GUID sebelumnya menjadi dua kunci terpisah - kunci primer (logis) pada GUID, dan kunci pengelompokan (pemesanan) pada
INT IDENTITY(1,1)
kolom terpisah .Karena Kimberly Tripp - Ratu Pengindeksan - dan yang lainnya telah menyatakan berkali-kali - a
GUID
karena kunci pengelompokan tidak optimal, karena karena keacakannya, itu akan menyebabkan fragmentasi halaman dan indeks yang masif dan pada umumnya kinerja yang 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 menderita masalah yang sama denganGUID
- hanya sedikit kurang begitu mencolok.Lalu ada masalah lain yang perlu dipertimbangkan: kunci pengelompokan pada tabel akan ditambahkan ke masing-masing dan setiap entri pada masing-masing dan setiap indeks yang tidak berkerumun di meja Anda juga - sehingga Anda benar-benar ingin memastikan itu sekecil mungkin. Biasanya, sebuah
INT
dengan 2+ miliar baris harus cukup untuk sebagian besar tabel - dan dibandingkan denganGUID
sebagai kunci pengelompokan, Anda dapat menghemat ratusan megabyte penyimpanan pada disk dan memori server.Penghitungan cepat - menggunakan
INT
vs.GUID
sebagai Primer dan Kunci Clustering:JUMLAH: 25 MB vs. 106 MB - dan itu hanya satu tabel!
Beberapa lebih banyak makanan untuk dipikirkan - hal-hal yang sangat baik oleh Kimberly Tripp - baca, baca lagi, cerna! Ini adalah pengindeksan SQL Server, sungguh.
PS: tentu saja, jika Anda berurusan dengan hanya beberapa ratus atau beberapa ribu baris - sebagian besar argumen ini tidak akan benar-benar berdampak pada Anda. Namun: jika Anda masuk ke dalam puluhan atau ratusan ribu baris, atau Anda mulai menghitung dalam jutaan - maka poin-poin itu menjadi sangat penting dan sangat penting untuk dipahami.
Pembaruan: jika Anda ingin
PKGUID
menjadikan kolom Anda sebagai kunci utama (tetapi bukan kunci pengelompokan Anda), dan kolom lainMYINT
(INT IDENTITY
) sebagai kunci pengelompokan Anda - gunakan ini:Pada dasarnya: Anda hanya perlu memberi tahu kendala secara eksplisit
PRIMARY KEY
bahwa ituNONCLUSTERED
(jika tidak dibuat sebagai indeks berkerumun Anda, secara default) - dan kemudian Anda membuat indeks kedua yang didefinisikan sebagaiCLUSTERED
Ini akan berfungsi - dan ini opsi yang valid jika Anda memiliki sistem yang sudah ada yang perlu "direkayasa ulang" untuk kinerja. Untuk sistem baru, jika Anda mulai dari awal, dan Anda tidak berada dalam skenario replikasi, maka saya akan selalu memilih
ID INT IDENTITY(1,1)
sebagai kunci utama saya yang terkelompok - jauh lebih efisien daripada yang lainnya!sumber
DATETIME
misalnya TIDAK berguna untuk kunci pengelompokan, karena mereka hanya memiliki akurasi 3,33 ms, dan dengan demikian duplikat dapat ada. Jadi dalam kasus seperti itu, Anda * masih memerlukan yangINT IDENTITY
sebaliknya - karena itu, saya biasanya menggunakannya secara default, karena dari 20 tahun pengalaman saya, kunci alam yang benar-benar dapat digunakan hampir tidak pernah benar-benar ada ....Saya telah menggunakan GUID sebagai PK sejak 2005. Dalam dunia basis data terdistribusi ini, ini benar-benar cara terbaik untuk menggabungkan data terdistribusi. Anda bisa memecat dan melupakan menggabungkan tabel tanpa khawatir ints cocok dengan tabel yang bergabung. Gabung GUID dapat disalin tanpa khawatir.
Ini adalah pengaturan saya untuk menggunakan GUID:
PK = GUID. GUID diindeks mirip dengan string, sehingga tabel baris tinggi (lebih dari 50 juta catatan) mungkin membutuhkan partisi tabel atau teknik kinerja lainnya. SQL Server menjadi sangat efisien, sehingga masalah kinerja semakin tidak berlaku.
Guid PK adalah indeks NON-Clustered. Jangan pernah mengelompokkan indeks GUID kecuali NewSequentialID. Tetapi meskipun demikian, reboot server akan menyebabkan jeda besar dalam pemesanan.
Tambahkan ClusterID Int ke setiap tabel. Ini adalah Indeks CLUSTERED Anda ... yang memesan meja Anda.
Bergabung dengan ClusterIDs (int) lebih efisien, tetapi saya bekerja dengan 20-30 juta tabel rekaman, jadi bergabung dengan GUID tidak tampak memengaruhi kinerja. Jika Anda menginginkan kinerja maksimal, gunakan konsep ClusterID sebagai kunci utama Anda & gabung di ClusterID.
Ini tabel Email saya ...
sumber
Saat ini saya sedang mengembangkan aplikasi web dengan EF Core dan di sini adalah pola yang saya gunakan:
Semua kelas saya (tabel) dan PK int dan FK. Saya sudah mendapat kolom tambahan dengan tipe Guid (dihasilkan oleh konstruktor c #) dengan indeks non clustered di atasnya.
Semua gabungan tabel dalam EF dikelola melalui kunci int sementara semua akses dari luar (pengontrol) dilakukan dengan Panduan.
Solusi ini memungkinkan untuk tidak menunjukkan kunci int pada url tetapi menjaga model tetap rapi dan cepat.
sumber
Jika Anda menggunakan GUID sebagai kunci utama dan membuat indeks berkerumun maka saya sarankan gunakan nilai default NEWSEQUENTIALID () untuk itu
sumber
Tautan ini mengatakan lebih baik daripada yang saya bisa dan membantu dalam pengambilan keputusan saya. Saya biasanya memilih int sebagai kunci utama, kecuali saya memiliki kebutuhan khusus untuk tidak melakukannya dan saya juga membiarkan SQL server menghasilkan otomatis / memelihara bidang ini kecuali saya memiliki alasan khusus untuk tidak melakukannya. Pada kenyataannya, masalah kinerja perlu ditentukan berdasarkan aplikasi spesifik Anda. Ada banyak faktor yang berperan di sini termasuk tetapi tidak terbatas pada ukuran db yang diharapkan, pengindeksan yang tepat, permintaan yang efisien, dan banyak lagi. Meskipun orang mungkin tidak setuju, saya pikir dalam banyak skenario Anda tidak akan melihat perbedaan dengan salah satu opsi dan Anda harus memilih apa yang lebih sesuai untuk aplikasi Anda dan apa yang memungkinkan Anda untuk mengembangkan lebih mudah, lebih cepat, dan lebih efektif (Jika Anda tidak pernah menyelesaikan aplikasi apa bedanya :).
https://web.archive.org/web/20120812080710/http://databases.aspfaq.com/database/what-should-i-choose-for-my-primary-key.html
PS Saya tidak yakin mengapa Anda akan menggunakan PK Komposit atau manfaat apa yang Anda yakini akan memberi Anda.
sumber
Sebagian besar waktu itu tidak boleh digunakan sebagai kunci utama untuk tabel karena itu benar-benar memukul kinerja database. tautan bermanfaat mengenai dampak GUID pada kinerja dan sebagai kunci utama.
sumber
Memiliki ID sekuensial membuatnya menjadi BANYAK lebih mudah bagi peretas atau penambang data untuk berkompromi dengan situs dan data Anda. Ingatlah itu ketika memilih PK untuk situs web.
sumber