Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Gia số nhận dạng đang nhảy trong cơ sở dữ liệu SQL Server

Bạn đang gặp phải hiện tượng này do cải tiến hiệu suất kể từ SQL Server 2012.

Theo mặc định, nó sử dụng kích thước bộ nhớ cache là 1.000 khi phân bổ IDENTITY giá trị cho một int cột và khởi động lại dịch vụ có thể "mất" các giá trị không sử dụng (Kích thước bộ nhớ cache là 10.000 cho bigint / numeric ).

Điều này được đề cập trong tài liệu

SQL Server có thể lưu vào bộ nhớ cache các giá trị nhận dạng vì lý do hiệu suất và một số giá trị được chỉ định có thể bị mất trong quá trình khởi động lại máy chủ lỗi cơ sở dữ liệu. Điều này có thể dẫn đến khoảng trống trong việc nâng cấp giá trị nhận dạng. Nếu khoảng trống không được chấp nhận thì ứng dụng nên sử dụng cơ chế gỡ bỏ của nó để tạo ra các giá trị chính. Sử dụng trình tạo trình tự với NOCACHE tùy chọn có thể hạn chế khoảng trống đối với các giao dịch không bao giờ được gửi.

Từ dữ liệu bạn đã hiển thị, có vẻ như điều này đã xảy ra sau khi nhập dữ liệu vào ngày 22 tháng 12, sau đó khi khởi động lại Máy chủ SQL được bảo lưu các giá trị 1206306 - 1207305 . Sau khi nhập dữ liệu từ ngày 24 đến ngày 25 tháng 12, một lần khởi động lại khác được thực hiện và Máy chủ SQL dành riêng phạm vi tiếp theo 1207306 - 1208305 hiển thị trong các mục của ngày 28.

Trừ khi bạn đang khởi động lại dịch vụ với tần suất bất thường, mọi giá trị "bị mất" sẽ không thể tạo ra bất kỳ sự sụt giảm đáng kể nào trong phạm vi giá trị mà loại dữ liệu cho phép, vì vậy chính sách tốt nhất là không nên lo lắng về điều đó.

Nếu đây là vì lý do nào đó, một vấn đề thực sự đối với bạn, một số cách giải quyết có thể xảy ra là ...

  1. Bạn có thể sử dụng SEQUENCE thay vì cột nhận dạng và xác định kích thước bộ nhớ cache nhỏ hơn chẳng hạn và sử dụng NEXT VALUE FOR trong một cột mặc định.
  2. Hoặc áp dụng cờ theo dõi 272 để tạo ra IDENTITY phân bổ được ghi lại như trong các phiên bản lên đến 2008 R2. Điều này áp dụng trên toàn cầu cho tất cả các cơ sở dữ liệu.
  3. Hoặc, đối với các phiên bản gần đây, hãy thực thi ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE = OFF để tắt bộ nhớ đệm danh tính cho một cơ sở dữ liệu cụ thể.

Bạn nên biết rằng không có cách giải quyết nào trong số này đảm bảo không có lỗ hổng. Điều này chưa bao giờ được đảm bảo bởi IDENTITY vì nó sẽ chỉ có thể thực hiện được bằng cách tuần tự hóa các chèn vào bảng. Nếu bạn cần một cột không có khoảng trống, bạn sẽ cần sử dụng một giải pháp khác với IDENTITY hoặc 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. SCOPE_IDENTITY () cho GUID?

  2. Xóa thư cơ sở dữ liệu khỏi cơ sở dữ liệu msdb trong SQL Server (T-SQL)

  3. Nhận 1 hàng trên cùng của mỗi nhóm

  4. Câu lệnh SQL Server RAISERROR với các ví dụ đơn giản

  5. Cách thay đổi nhiều cột cùng một lúc trong SQL Server