Anda mengalami perilaku ini karena peningkatan kinerja sejak SQL Server 2012.
Sekarang secara default menggunakan ukuran cache 1.000 saat mengalokasikan IDENTITY
nilai untuk int
kolom dan memulai ulang layanan dapat "kehilangan" nilai yang tidak digunakan (Ukuran cache 10.000 untuk bigint
/numeric
).
Ini disebutkan dalam dokumentasi
SQL Server mungkin menyimpan nilai identitas untuk alasan kinerja dan beberapa nilai yang ditetapkan dapat hilang selama kegagalan database atau restart server. Hal ini dapat mengakibatkan kesenjangan dalam nilai identitas saat dimasukkan. Jika kesenjangan tidak dapat diterima maka aplikasi harus menggunakan mekanismenya sendiri untuk menghasilkan nilai kunci. Menggunakan generator urutan dengan
NOCACHE
opsi dapat membatasi celah untuk transaksi yang tidak pernah dilakukan.
Dari data yang Anda tunjukkan sepertinya ini terjadi setelah entri data untuk 22 Desember lalu ketika restart SQL Server memesan nilai 1206306 - 1207305
. Setelah entri data untuk 24 - 25 Desember dilakukan restart lagi dan SQL Server mencadangkan rentang berikutnya 1207306 - 1208305
terlihat di entri untuk tanggal 28.
Kecuali jika Anda memulai ulang layanan dengan frekuensi yang tidak biasa, nilai "hilang" apa pun tidak akan membuat penyok signifikan dalam rentang nilai yang diizinkan oleh tipe data sehingga kebijakan terbaik tidak perlu mengkhawatirkannya.
Jika ini karena alasan tertentu menjadi masalah nyata bagi Anda, beberapa solusi yang mungkin adalah...
- Anda dapat menggunakan
SEQUENCE
alih-alih kolom identitas dan tentukan ukuran cache yang lebih kecil misalnya dan gunakanNEXT VALUE FOR
dalam kolom default. - Atau terapkan tanda jejak 272 yang membuat
IDENTITY
alokasi dicatat seperti dalam versi hingga 2008 R2. Ini berlaku secara global untuk semua database. - Atau, untuk versi terbaru, jalankan
ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE = OFF
untuk menonaktifkan caching identitas untuk database tertentu.
Anda harus menyadari bahwa tidak satu pun dari solusi ini yang menjamin tidak ada celah. Ini tidak pernah dijamin oleh IDENTITY
karena itu hanya mungkin dengan membuat serial sisipan ke tabel. Jika Anda membutuhkan kolom tanpa celah, Anda harus menggunakan solusi yang berbeda dari IDENTITY
atau SEQUENCE