Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Uniqueidentifier vs. IDENTITY vs. Material Code --manakah pilihan terbaik untuk primary key?

GUID 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:

  1. 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 , sebuah GUID , sebuah string - pilih yang paling masuk akal untuk skenario Anda.

  2. kunci pengelompokan (kolom atau kolom yang mendefinisikan "indeks berkerumun" pada tabel) - ini adalah fisik hal terkait penyimpanan, dan di sini, tipe data kecil, stabil, dan terus meningkat adalah pilihan terbaik Anda - INT atau BIGINT 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 yang sangat besar ketika memecah kunci primer/kelompok berbasis GUID sebelumnya menjadi dua kunci terpisah - kunci utama (logis) pada GUID , dan kunci pengelompokan (pengurutan) pada INT IDENTITY(1,1) separate yang terpisah kolom.

Sebagai Kimberly Tripp - Ratu Pengindeksan - dan yang lainnya telah menyatakan berkali-kali - sebuah GUID karena kunci pengelompokan tidak optimal, 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 dengan GUID - hanya sedikit kurang menonjol.

Lalu ada masalah lain yang perlu dipertimbangkan:kunci pengelompokan di atas meja akan ditambahkan ke setiap entri di setiap indeks non-cluster di meja Anda juga - jadi Anda benar-benar ingin memastikannya sekecil mungkin. Biasanya, sebuah INT dengan 2+ miliar baris seharusnya cukup untuk sebagian besar tabel - dan dibandingkan dengan GUID sebagai kunci pengelompokan, Anda dapat menghemat ratusan megabita penyimpanan di disk dan di 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.

Kecuali Anda memiliki alasan yang sangat bagus , saya berpendapat untuk menggunakan INT IDENTITY untuk hampir setiap tabel data "nyata" sebagai default untuk kunci utamanya - unik, stabil (tidak pernah berubah), sempit, terus meningkat - semua properti bagus yang ingin Anda miliki dalam kunci pengelompokan untuk kinerja tabel SQL Server yang cepat dan andal!

Jika Anda memiliki beberapa nilai kunci "alami" yang juga memiliki semua properti itu, maka Anda mungkin juga menggunakannya sebagai ganti kunci pengganti. Tapi dua string panjang variabel maks. 20 karakter masing-masing tidak memenuhi persyaratan itu menurut saya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Instance SSRS baru dengan Database Engine lama?

  2. 3 Cara Mendapatkan Skema Hasil yang Ditetapkan di SQL Server

  3. Keandalan Ketergantungan Sql?

  4. Ekspor data kueri SQL ke Excel

  5. Apa cara terbaik untuk menyisipkan basis data massal dari c #?