Di salah satu tabel saya Fee
di kolom "ReceiptNo" di peningkatan identitas database SQL Server 2012 tiba-tiba mulai melompat ke 100, bukan 1, tergantung pada dua hal berikut.
jika 1205446 itu melompat ke 1206306, jika 1206321, itu melompat ke 1207306 dan jika 1207314, itu melompat ke 1208306. Yang saya ingin Anda perhatikan adalah bahwa tiga digit terakhir tetap konstan yaitu 306 setiap kali lompatan terjadi seperti yang ditunjukkan pada gambar berikut.
masalah ini terjadi saat saya me-restart komputer saya
order by ReceiptNo
ke kueri Anda, apakah rekaman itu benar-benar tidak ada? Apakah Anda yakin saat record disisipkan tidak ada kesalahan? Jika rekaman mencoba untuk dimasukkan dan gagal, identitas akan bertambah, hal yang sama jika rekaman dihapus. Jika catatan dihapus,ReceiptNo
tidak direset. Bisakah Anda memposting buat tabel untukFee
tabel?1206306
,1207306
,1207806
) berarti penjelasan di Connect Barang Thread hampir pasti berlaku.Jawaban:
Anda mengalami perilaku ini karena peningkatan kinerja sejak SQL Server 2012.
Sekarang secara default menggunakan ukuran cache 1.000 ketika mengalokasikan
IDENTITY
nilai untukint
kolom dan memulai kembali layanan dapat "kehilangan" nilai yang tidak digunakan (Ukuran cache 10.000 untukbigint
/numeric
).Ini disebutkan dalam dokumentasi
Dari data yang Anda tunjukkan sepertinya ini terjadi setelah entri data untuk 22 Desember lalu ketika restart SQL Server mencadangkan nilai
1206306 - 1207305
. Setelah entri data untuk 24 - 25 Desember dilakukan restart lagi dan SQL Server memesan kisaran berikutnya yang1207306 - 1208305
terlihat di entri untuk tanggal 28.Kecuali jika Anda memulai ulang layanan dengan frekuensi yang tidak biasa, setiap nilai yang "hilang" kemungkinan tidak akan membuat perubahan signifikan dalam rentang nilai yang diizinkan oleh tipe data, jadi kebijakan terbaik adalah tidak mengkhawatirkannya.
Jika ini karena alasan tertentu menjadi masalah nyata bagi Anda, beberapa solusi yang mungkin adalah ...
SEQUENCE
pengganti kolom identitas dan menentukan ukuran cache yang lebih kecil misalnya dan digunakanNEXT VALUE FOR
dalam default kolom.IDENTITY
alokasi dicatat sebagai versi hingga 2008 R2. Ini berlaku secara global untuk semua database.ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE = OFF
untuk menonaktifkan cache identitas untuk database tertentu.Anda harus menyadari bahwa tidak ada solusi yang menjamin tidak ada celah. Ini tidak pernah dijamin oleh
IDENTITY
karena hanya mungkin dengan membuat serialisasi sisipan ke tabel. Jika Anda membutuhkan kolom tanpa celah, Anda perlu menggunakan solusi yang berbeda dariIDENTITY
atauSEQUENCE
sumber
SEQUENCE
bukanIDENTITY
dan mengatur Urutan untuk memiliki ukuran cache0
.CREATE TABLE
saya melihat Anda sedang menggunakannumeric(7)
dan telah memulai penomoran pada1200001
itu berarti Anda akan habis setelah8,799
hari (24 tahun) jika Anda menggunakan 1.000 per hari.big int
kolom biasanya akan "melompat" 10.000 per restart.Masalah ini terjadi setelah memulai ulang SQL Server.
Solusinya adalah:
Jalankan Manajer Konfigurasi SQL Server .
Pilih Layanan SQL Server .
Klik kanan SQL Server dan pilih Properties .
Di jendela pembuka di bawah Parameter Startup , ketik
-T272
dan klik Add , lalu tekan tombol Apply dan restart.sumber
Dari
SQL Server 2017+
Anda dapat menggunakan ALTER DATABASE SCOPED CONFIGURATION :sumber
Saya tahu jawaban saya mungkin terlambat ke pesta. Tetapi saya telah menyelesaikannya dengan cara lain dengan menambahkan prosedur start up yang tersimpan di SQL Server 2012.
Buat prosedur tersimpan berikut di master DB.
Kemudian tambahkan ke Start up dengan menggunakan sintaks berikut.
Ini adalah ide yang bagus jika Anda memiliki sedikit tabel. tetapi jika Anda harus melakukannya untuk banyak tabel, metode ini masih berfungsi tetapi bukan ide yang baik.
sumber
Ini masih menjadi masalah yang sangat umum di antara banyak pengembang dan aplikasi terlepas dari ukurannya.
Sayangnya saran di atas tidak memperbaiki semua skenario, yaitu Shared hosting, Anda tidak dapat mengandalkan host Anda untuk menyetel parameter startup -t272.
Juga, jika Anda memiliki tabel yang sudah ada yang menggunakan kolom identitas ini untuk kunci utama, itu adalah upaya BESAR untuk melepaskan kolom tersebut dan membuat ulang yang baru untuk menggunakan solusi urutan BS. Solusi Urutan hanya bagus jika Anda mendesain tabel baru dari awal di SQL 2012+
Intinya adalah, jika Anda menggunakan Sql Server 2008R2, TETAP TETAP. Serius, tetaplah di sana. Hingga Microsoft mengakui bahwa mereka memperkenalkan bug BESAR, yang masih ada bahkan di Sql Server 2016, maka kita tidak boleh memutakhirkan sampai mereka memilikinya dan MEMPERBAIKI.
Microsoft langsung memperkenalkan perubahan besar, yaitu mereka merusak API yang berfungsi yang tidak lagi berfungsi seperti yang dirancang, karena fakta bahwa sistem mereka melupakan identitas mereka saat ini saat restart. Cache atau tidak ada cache, ini tidak dapat diterima, dan pengembang Microsoft bernama Bryan harus memilikinya, alih-alih memberi tahu dunia bahwa itu "berdasarkan desain" dan "fitur". Tentu, caching adalah sebuah fitur, tetapi kehilangan jejak tentang identitas selanjutnya, BUKANLAH FITUR. Ini BUG fricken !!!
Saya akan membagikan solusi yang saya gunakan, karena DB saya ada di server Shared Hosting, juga, saya tidak menghapus dan membuat ulang kolom Kunci Utama saya, itu akan menjadi PITA yang besar.
Sebaliknya, ini adalah peretasan saya yang memalukan (tetapi tidak memalukan seperti bug POS yang diperkenalkan oleh Microsoft).
Retas / Perbaiki:
Sebelum memasukkan perintah Anda, cukup reseed identitas Anda sebelum setiap sisipan. Perbaikan ini hanya disarankan jika Anda tidak memiliki kontrol admin atas instance Sql Server Anda, jika tidak, saya sarankan untuk melakukan reseeding saat restart server.
Hanya 3 baris itu tepat sebelum sisipan Anda, dan Anda harus melakukannya dengan baik. Ini benar-benar tidak akan terlalu mempengaruhi kinerja, yaitu tidak akan terlihat.
Semoga berhasil.
sumber
Ada banyak kemungkinan alasan untuk melompati nilai-nilai identitas. Mulai dari sisipan yang digulung kembali hingga manajemen identitas untuk replikasi. Apa yang menyebabkan ini dalam kasus Anda, saya tidak tahu tanpa menghabiskan waktu di sistem Anda.
Namun Anda harus tahu, bahwa Anda tidak boleh menganggap kolom identitas bersebelahan. Ada terlalu banyak hal yang dapat menyebabkan kesenjangan.
Anda dapat menemukan lebih banyak informasi tentang ini di sini: http://sqlity.net/en/792/the-gap-in-the-identity-value-sequence/
sumber