Chúng tôi đang chạy SQL Server 2012 SP1 x64 (11.0.3000.0)SQL Server: tùy ý auto-increment của chính
Tôi có bảng sau với lĩnh vực InvoiceId
như auto-incrementing, khóa chính:
CREATE TABLE Orders(
InvoiceId bigint IDENTITY(1001,1) NOT FOR REPLICATION,
OrderId varchar(8) NOT NULL,
... -- other fields removed for brevity
CONSTRAINT [PK_ORDERS] PRIMARY KEY CLUSTERED (InvoiceId)
ON [PRIMARY],
)
hàng mới được chèn mặc dù một thủ tục lưu trữ đơn giản như sau:
SET XACT_ABORT ON
SET NOCOUNT ON
BEGIN TRANSACTION
INSERT INTO Orders(
OrderId,
... -- other fields removed for brevity
)
VALUES (
@orderId,
...
)
SELECT @newRowId = SCOPE_IDENTITY()
COMMIT TRANSACTION
thủ tục trên để trả về mới được tạo ra hàng-id (Orders.InvoiceId
) cho người gọi.
Mã hoạt động hoàn hảo, với [InvoiceId]
bắt đầu từ 1001 và tăng thêm 1 cho mỗi lần chèn liên tiếp.
Người dùng của chúng tôi đã chèn khoảng 130 hàng. [InvoiceId]
vào lúc 1130, sau đó chèn giá trị tiếp theo lên giá trị !
Dưới đây là ảnh chụp màn hình dữ liệu:
Tôi đang bối rối như những gì vừa xảy ra ở đây. Tại sao bộ đếm tự động đột nhiên bỏ qua gần 10.000 điểm?
Chúng tôi đang sử dụng giá trị [InvoiceId]
để tạo mã vạch, vì vậy, chúng tôi muốn giá trị nằm trong một phạm vi cụ thể, tốt nhất là trong một chuỗi liền kề.
Tôi đã sử dụng tài liệu T-SQL nhưng không tìm thấy bất kỳ điều gì liên quan đến vấn đề của mình. Đây có phải là hành vi bình thường (số lượng tùy ý) của trường nhận dạng không?
CẬP NHẬT Nhờ Marting & Aron, tôi đã tìm được công việc. Dưới đây là official response từ Microsoft:
Trong SQL Server 2012 việc triển khai thuộc tính nhận dạng đã được thay đổi để phù hợp với đầu tư vào các tính năng khác. Trong các phiên bản trước của SQL Server, việc theo dõi việc tạo danh tính dựa vào các bản ghi nhật ký giao dịch cho từng giá trị nhận dạng được tạo ra. Trong SQL Server 2012, chúng tôi tạo các giá trị nhận dạng theo lô và chỉ ghi nhật ký giá trị lớn nhất của lô. Điều này làm giảm số lượng và tần suất của thông tin được ghi vào nhật ký giao dịch cải thiện chèn khả năng mở rộng.
Nếu bạn cần ngữ nghĩa thế hệ sắc giống như trước phiên bản của SQL Server có hai tùy chọn có sẵn:
• Sử dụng dấu vết cờ 272 o Điều này sẽ gây ra một kỷ lục ghi được tạo ra cho mỗi sắc tạo giá trị. Hiệu suất của việc tạo danh tính có thể bị ảnh hưởng bởi việc bật cờ theo dõi này.
• Sử dụng bộ tạo tín hiệu với NO CACHE cài đặt (http://msdn.microsoft.com/en-us/library/ff878091.aspx) o này sẽ gây ra một kỷ lục ghi được tạo ra cho mỗi giá trị chuỗi tạo ra. Lưu ý rằng hiệu suất của việc tạo giá trị chuỗi có thể là bị ảnh hưởng bởi việc sử dụng NO CACHE.
Ví dụ:
CREATE SEQUENCE s1 AS INT START WITH 1 NO CACHE;
CREATE TABLE t1 (Id INT PRIMARY KEY DEFAULT NEXT VALUE FOR s1, col INT NOT NULL);
'IDENTITY' chưa bao giờ được bảo đảm tiếp giáp nhưng có một vấn đề được biết đến vào năm 2012, nơi nó có thể đột nhiên nhảy để lại những khoảng trống lớn sau khi khởi động lại dịch vụ. –
Cảm ơn @MartinSmith! Điều này có vẻ là vấn đề trong trường hợp của tôi. Tôi nhớ khởi động lại máy db trước khi nhảy tăng danh tính! Làm thế nào tôi có thể tránh điều này? – masroore
Bạn không thể tránh nó vì chắc chắn rằng sự tiếp giáp không bao giờ được bảo đảm nhưng có một cờ theo dõi bạn có thể thiết lập để có hành vi chậm hơn (đăng nhập) 2008 hoặc bạn có thể sử dụng một chuỗi với kích thước bộ nhớ cache nhỏ hơn. Xem [thảo luận tại đây] (https://connect.microsoft.com/SQLServer/feedback/details/739013/failover-or-restart-results-in-reseed-of-identity) –