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

Peningkatan identitas melompat di database SQL Server

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...

  1. Anda dapat menggunakan SEQUENCE alih-alih kolom identitas dan tentukan ukuran cache yang lebih kecil misalnya dan gunakan NEXT VALUE FOR dalam kolom default.
  2. Atau terapkan tanda jejak 272 yang membuat IDENTITY alokasi dicatat seperti dalam versi hingga 2008 R2. Ini berlaku secara global untuk semua database.
  3. 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Memperkenalkan Pemutaran—Diagnosis Titik Baru dalam Waktu untuk Spotlight Cloud

  2. Kesalahan Login SQL Server:Login gagal untuk pengguna 'NT AUTHORITY\SYSTEM'

  3. Bagaimana Memperbaiki Kesalahan Microsoft SQL Server 926? - Terselesaikan

  4. SQL Server 2005 - Ekspor tabel secara terprogram (jalankan file .sql untuk membangunnya kembali)

  5. Urutkan Peluru di Database