Saya tahu jenis pertanyaan ini banyak muncul, tetapi saya belum membaca argumen yang meyakinkan untuk membantu saya membuat keputusan ini. Tolong bersamaku!
Saya memiliki database besar - itu tumbuh sekitar 10.000.000 catatan per hari. Data bersifat relasional, dan untuk alasan kinerja saya memuat tabel dengan BULK COPY. Untuk alasan ini, saya perlu membuat kunci untuk baris, dan tidak dapat mengandalkan kolom IDENTITAS.
Bilangan bulat 64-bit - bigint - cukup lebar untuk saya gunakan, tetapi untuk menjamin keunikan, saya membutuhkan generator terpusat untuk membuat ID saya untuk saya. Saat ini saya memiliki layanan generator yang memungkinkan layanan untuk memesan nomor urut X dan tidak menjamin tabrakan. Namun, konsekuensi dari ini adalah bahwa semua layanan yang saya miliki bergantung pada generator terpusat yang satu ini, dan jadi saya terbatas dalam bagaimana saya dapat mendistribusikan sistem saya dan tidak senang dengan dependensi lain (seperti membutuhkan akses jaringan) yang dikenakan oleh desain ini. Ini merupakan masalah pada kesempatan tertentu.
Saya sekarang mempertimbangkan untuk menggunakan GUID berurutan sebagai kunci utama saya (dihasilkan secara eksternal ke SQL). Sejauh yang saya dapat memastikan dari pengujian saya sendiri, satu-satunya kelemahan untuk ini adalah ruang disk overhead dari tipe data yang lebih luas (yang diperburuk oleh penggunaannya dalam indeks). Saya belum melihat adanya pelemahan yang terlihat dalam kinerja kueri, dibandingkan dengan alternatif bigint. Memuat tabel dengan BULK COPY sedikit lebih lambat, tetapi tidak terlalu banyak. Indeks berbasis GUID saya tidak menjadi terfragmentasi berkat implementasi GUID berurutan saya.
Pada dasarnya, yang ingin saya ketahui adalah jika ada pertimbangan lain yang mungkin saya abaikan. Saat ini, saya cenderung untuk melakukan lompatan dan mulai menggunakan GUID. Saya sama sekali bukan pakar basis data, jadi saya sangat menghargai panduan apa pun.
sumber
Jawaban:
Saya dalam situasi yang sama. Saat ini, saya menggunakan pendekatan GUID berurutan dan tidak memiliki fragmentasi dan pembuatan kunci yang mudah.
Saya perhatikan dua disadavantage yang menyebabkan saya mulai bermigrasi ke bigint:
(2) Apakah pembunuhnya bagi saya.
Sekarang saya akan menghasilkan kunci saya seperti ini:
Saya akan menggunakan tanggal plus jam terkemuka dan memiliki bagian berurutan setelah itu. Itu memungkinkan saya untuk melakukan range-query data saya berdasarkan tanggal tanpa indeks tambahan sama sekali. Ini bonus bagus untukku.
Saya akan menghasilkan bagian berurutan dari bigint menggunakan algoritma HiLo yang cocok untuk didistribusikan .
Semoga beberapa transfer ini ke situasi Anda. Saya merekomendasikan penggunaan bigint.
sumber
Dengan tipe
INT
, mulai dari 1, Anda mendapatkan lebih dari 2 miliar baris yang mungkin - yang seharusnya lebih dari cukup untuk sebagian besar kasus. DenganBIGINT
, Anda mendapatkan sekitar 922 kuadriliun (922 dengan 15 nol - 922'000 miliar) - cukup untuk Anda ??Jika Anda menggunakan
INT IDENTITY
awal pada 1, dan Anda memasukkan baris setiap detik, Anda perlu 66,5 tahun sebelum Anda mencapai batas 2 miliar ....Jika Anda menggunakan
BIGINT IDENTITY
awal pada 1, dan Anda memasukkan seribu baris setiap detik, Anda memerlukan 292 juta tahun yang mencengangkan sebelum Anda mencapai batas 922 kuadriliun ....Dengan menggunakan 10 juta baris per hari, itu akan membuat Anda memiliki angka yang cukup untuk sekitar 1'844'674'407'370 hari ( 1844 miliar hari atau lebih dari 5 miliar tahun ) data - apakah itu cukup baik untuk kebutuhan Anda ?
Baca lebih lanjut tentang itu (dengan semua opsi ada) di MSDN Books Online .
sumber
BIGINT
rentang secepat itu, ....BIGINT IDENTITY
?Saya sarankan Anda menggunakan SEQUENCE tipe data BIGINT di SQL 2012 Ini jauh lebih fleksibel daripada IDENTITAS dengan opsi seperti cache / nocache, Anda juga dapat menetapkan rentang urutan untuk operasi batch Anda sebagai sp_afterence_get_range.
sumber
Apakah alasan Anda tidak dapat menggunakan IDENTITAS karena sudah ada hubungan kunci asing antara tabel terpisah yang Anda muat? Dan tidak ada kunci alami lain bagi Anda untuk dapat menghubungkan mereka dalam operasi dari area pementasan ke area produksi? Untuk alasan itu, saya ingin tahu lebih banyak tentang bagaimana mereka saat ini "ditautkan" dalam sistem sumber sebelum Anda menyalin secara massal? Apakah beberapa sistem sumber hanya menggunakan urutan mereka sendiri dan memiliki kemungkinan untuk urutan yang bertentangan ketika dibawa ke database bersama?
Teknik COMB ID / urutan GUID adalah salah satu yang saya kenal, dan itu bisa diterapkan kapan saja Anda secara efektif membutuhkan keunikan global yang ditugaskan di luar database - itu secara efektif identitas baris yang dapat digunakan baik di dalam maupun di luar database. Untuk alasan itu, dalam lingkungan yang sangat terdistribusi atau skenario yang terputus, itu adalah pilihan yang OK
Kecuali jika Anda benar-benar tidak membutuhkannya, Karena perbedaan lebar ekstra itu penting ketika ukuran data tumbuh dan kunci-kunci ini ada di setiap indeks dan set kerja untuk banyak pertanyaan.
Juga, dengan generasi didistribusikan, jika baris tidak benar-benar datang dalam urutan kolom GUID, masalah dengan menggunakan ini untuk kunci indeks berkerumun (sempit, statis, meningkat) berpotensi menyebabkan beberapa fragmentasi dibandingkan dengan pengelompokan pada IDENTITAS masih tetap.
sumber
Secara umum dimungkinkan untuk menggunakan
OUTPUT
klausaINSERT
perintah untuk memasukkan data ke dalam tabel dan terkait dengan bidang identitas.Identifier yang didasarkan pada stempel waktu tidak boleh dianggap andal - itu tergantung pada jam sistem yang pada gilirannya tergantung pada banyak hal - dari jam perangkat keras ke layanan sinkronisasi waktu.
sumber