2013-08-26 33 views
9
chính

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:

data

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); 
+5

'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ụ. –

+0

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

+1

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) –

Trả lời

2

CẬP NHẬT Cảm ơn Marting & Aron, tôi đã tìm được công việc xung quanh. Đây là phản hồi chính thức 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 trên các bản ghi nhật ký giao dịch cho mỗi giá trị nhận dạng được tạo ra. Trong SQL Server 2012, chúng tôi tạo ra các giá trị nhận dạng theo lô và chỉ ghi lại giá trị tối đa của lô. Điều này làm giảm số lượng và tần suất thông tin được ghi vào nhật ký giao dịch cải thiện khả năng mở rộng chèn.

Nếu bạn cần ngữ nghĩa thế hệ sắc tương tự như các phiên bản trước 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 giá trị bản sắc tạo ra. Hiệu suất 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 trình tạo trình tự có cài đặt NO CACHE (http://msdn.microsoft.com/en-us/library/ff878091.aspx) o Điều này sẽ làm cho bản ghi nhật ký được tạo cho mỗi giá trị chuỗi được tạo. Lưu ý rằng hiệu suất tạo ra chuỗi giá trị có thể 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); 
0

Ngoài ra, bạn có thể có một bảng chuyên dụng với các quầy. Nó không phải là một mẫu thiết kế tốt nhưng nó đặt bạn kiểm soát đầy đủ về cách thức làm việc danh tính.

Các vấn đề liên quan