Saya setelah beberapa konfirmasi dari ide ini untuk memperbaiki database berkinerja buruk atau saran yang lebih baik jika ada yang memilikinya. Selalu terbuka untuk saran yang lebih baik.
Saya memiliki basis data yang sangat besar (20+ juta catatan tumbuh sekitar 1/2 juta per hari) yang menggunakan GUID sebagai PK.
Pengawasan pada bagian saya tetapi PK berkerumun di SQL server dan menyebabkan masalah kinerja.
Alasan untuk panduan - database ini sebagian disinkronkan dengan 150 database lain sehingga PK harus unik. Sinkronisasi tidak dikelola oleh SQL Server, melainkan ada proses kustom yang dibangun yang membuat data tetap sinkron untuk persyaratan sistem - semua didasarkan pada GUID itu.
Masing-masing dari 150 basis data jauh tidak menyimpan data lengkap seperti yang disimpan di Database SQL pusat. mereka hanya menyimpan sebagian dari data yang sebenarnya mereka butuhkan, dan data yang dibutuhkan tidak unik bagi mereka (10 dari 150 basis data mungkin memiliki beberapa catatan yang sama dari basis data situs lain misalnya - mereka bagikan). Juga - data sebenarnya dihasilkan di lokasi terpencil - bukan di titik pusat - maka kebutuhan untuk GUID.
Basis data pusat digunakan tidak hanya untuk menjaga semuanya tetap sinkron, tetapi permintaan dari 3000+ pengguna akan dieksekusi terhadap database terfragmentasi yang sangat besar. Ini sudah merupakan masalah besar dalam pengujian awal.
Untungnya kita belum tayang - jadi saya bisa membuat perubahan dan membuat offline jika diperlukan yang setidaknya adalah sesuatu.
Kinerja basis data jauh bukanlah masalah - himpunan bagian data cukup kecil dan database biasanya tidak pernah mencapai di atas 1GB secara total. Catatan dimasukkan kembali ke sistem utama secara teratur dan dihapus dari BD yang lebih kecil ketika tidak lagi diperlukan.
Kinerja pusat DB yang merupakan penjaga semua catatan menyedihkan - karena GUID berkerumun sebagai kunci utama untuk banyak catatan. Fragmentasi indeks tidak aktif.
Jadi - pemikiran saya untuk memperbaiki masalah kinerja adalah membuat kolom baru - IDENTITAS BIGINT yang tidak ditandatangani (1,1) dan kemudian mengubah PK yang dikelompokkan dari tabel kolom BIGINT.
Saya akan membuat indeks Unik Non Clustered pada bidang GUID yang merupakan kunci utama.
Remote 150 database yang lebih kecil tidak perlu tahu tentang PK baru pada database SQL Server Pusat - ini murni akan digunakan untuk mengatur data dalam database dan menghentikan kinerja buruk dan fragmentasi.
Apakah ini bekerja dan meningkatkan kinerja database SQL pusat dan mencegah neraka masa depan indeks fragmentasi (ke tingkat tertentu)? atau apakah saya melewatkan sesuatu yang sangat penting di sini yang akan melompat dan menggigit saya dan menyebabkan lebih banyak kesedihan?
sumber
int
habis dalam 4255 hari (11,5 tahun). Jika dia melakukan itu, dia hanya akan menyalahkanmu dalam 11,5 tahun;)Jawaban:
Anda tentu TIDAK perlu mengelompokkan pada GUID. Jika Anda memiliki sesuatu yang akan memungkinkan Anda untuk mengidentifikasi secara unik catatan selain dari GUID itu, saya sarankan Anda melihat membangun indeks unik pada bidang lain & membuat indeks itu mengelompok. Jika tidak, Anda bebas mengelompokkan pada bidang lain, bahkan menggunakan indeks nonunique. Pendekatannya adalah dengan mengelompokkan namun terbaik memfasilitasi pemisahan data Anda dan permintaan - jadi, jika Anda memiliki bidang "wilayah", atau sesuatu, yang mungkin menjadi kandidat untuk skema pengelompokan Anda.
Masalah dengan mengubah ke
BIGINT
akan penambahan data dari database lain & mengintegrasikan database mereka ke dalam toko pusat. Jika ini bukan pertimbangan - dan tidak akan pernah menjadi pertimbangan - maka, ya,BIGINT
akan menyelesaikan masalah penyeimbangan ulang indeks dengan baik.Di belakang layar, jika Anda tidak menentukan indeks berkerumun, SQL Server melakukan hal yang sama: menciptakan bidang ID baris & memetakan semua indeks lainnya ke dalamnya. Jadi, dengan melakukannya sendiri, Anda menyelesaikannya seperti SQL akan menyelesaikannya.
sumber
Itu perintah yang sulit.
Izinkan saya menyarankan pendekatan perantara.
Saya mengalami masalah dengan System.Guid.NewGuid () menghasilkan panduan acak. (Saya mengizinkan klien untuk membuat panduan mereka sendiri, daripada mengandalkan database untuk membuat sequentialid).
Setelah saya pindah ke UuidCreateSequential di sisi klien, kinerja saya menjadi JAUH lebih baik, terutama pada INSERT.
Berikut ini adalah kode klien DotNet voodoo. Saya yakin saya menggadaikan dari suatu tempat:
ALTERNATE IDEA:
Jika db utama dan remote db Anda "ditautkan" (seperti pada, sp_linkserver) ...... maka Anda bisa menggunakan db utama sebagai "generator uuid".
Anda tidak ingin mendapatkan uuid's "satu per satu", itu terlalu banyak mengobrol.
Tapi Anda bisa mengambil satu set uuid.
Berikut ini beberapa kode:
/ *
* /
sumber
Berdasarkan deskripsi Anda, pergi dengan BIGINT. Namun, indeks untuk GUID dapat menjadi non-unik, karena GUID seharusnya unik secara global.
sumber
Jika GUID disimpan dengan benar sebagai pengidentifikasi unik seharusnya tidak memiliki masalah kinerja ... dan jika Anda dapat menggunakan GUID Sequential lebih baik ...
@Mattytommo juga memiliki poin bagus sekitar 11,5 tahun dengan menggunakan INT ...
sumber