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

Kinerja GUID

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:

  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 di atas meja) - 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 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara membaca file besar dari disk ke database tanpa kehabisan memori?

  2. Bagaimana saya bisa membaca 15+ juta catatan secara efisien dari SQL Server, melakukan pemrosesan, dan menulisnya ke file datar?

  3. Bagaimana membandingkan antara waktu dalam loop sementara dalam prosedur tersimpan?

  4. Saya telah kehilangan database SQL Server 2008, saya perlu struktur database kembali dari skema LINQ

  5. Efisien Menangani Beberapa Kendala Opsional di Mana Klausul