Trình tự so với danh tính


87

SQL Server 2012 được giới thiệu Sequencenhư một tính năng mới, giống như trong Oracle và Postgres. Trường hợp trình tự được ưu tiên hơn danh tính? Và tại sao chúng ta cần trình tự?


Sau khi sử dụng cả hai, tôi thích Identity để sử dụng chung trong cơ sở dữ liệu. Đó là, nơi bạn cần một số tự động tăng dần như ObjectID và muốn sử dụng nó trên nhiều bảng. Việc tạo một chuỗi phức tạp và sau đó sử dụng một ứng dụng (trang web hoặc ứng dụng, v.v.) để quản lý việc chèn và cập nhật bảng dựa trên số thứ tự.
tập một

Câu trả lời:


81

Tôi nghĩ bạn sẽ tìm thấy câu trả lời của mình ở đây

Sử dụng thuộc tính nhận dạng cho một cột, bạn có thể dễ dàng tạo các số tự động tăng dần (thường được sử dụng làm khóa chính). Với Sequence, nó sẽ là một đối tượng khác mà bạn có thể đính kèm vào cột bảng trong khi chèn. Không giống như danh tính, số tiếp theo cho giá trị cột sẽ được truy xuất từ ​​bộ nhớ chứ không phải từ đĩa - điều này làm cho Trình tự nhanh hơn đáng kể so với Danh tính. Chúng ta sẽ thấy điều này trong các ví dụ tới.

đây :

Chuỗi: Chuỗi đã được cộng đồng SQL Server yêu cầu trong nhiều năm và nó được bao gồm trong bản phát hành này. Sequence là một đối tượng do người dùng định nghĩa tạo ra một chuỗi số. Đây là một ví dụ sử dụng Trình tự.

ở đây nữa:

Một đối tượng chuỗi SQL Server tạo chuỗi số giống như một cột nhận dạng trong bảng sql. Nhưng ưu điểm của số thứ tự là đối tượng số thứ tự không bị giới hạn với bảng sql đơn.

và trên msdn, bạn cũng có thể đọc thêm về cách sử dụng và lý do tại sao chúng tôi cần nó ( tại đây ):

Chuỗi là một đối tượng liên kết giản đồ do người dùng xác định tạo ra một chuỗi các giá trị số theo đặc điểm kỹ thuật mà chuỗi được tạo. Chuỗi các giá trị số được tạo theo thứ tự tăng dần hoặc giảm dần trong một khoảng thời gian xác định và có thể quay vòng (lặp lại) theo yêu cầu. Các chuỗi, không giống như các cột nhận dạng, không được liên kết với các bảng. Một ứng dụng đề cập đến một đối tượng trình tự để nhận giá trị tiếp theo của nó. Mối quan hệ giữa các chuỗi và bảng được kiểm soát bởi ứng dụng. Các ứng dụng của người dùng có thể tham chiếu đến một đối tượng chuỗi và điều phối các khóa giá trị trên nhiều hàng và bảng.

Một chuỗi được tạo độc lập với các bảng bằng cách sử dụng câu lệnh CREATE SEQUENCE. Các tùy chọn cho phép bạn kiểm soát giá trị gia tăng, giá trị tối đa và tối thiểu, điểm bắt đầu, khả năng khởi động lại tự động và bộ nhớ đệm để cải thiện hiệu suất. Để biết thông tin về các tùy chọn, hãy xem TẠO DANH MỤC.

Không giống như các giá trị cột nhận dạng, được tạo khi các hàng được chèn vào, ứng dụng có thể lấy số thứ tự tiếp theo trước khi chèn hàng bằng cách gọi hàm NEXT VALUE FOR. Số thứ tự được cấp phát khi NEXT VALUE FOR được gọi ngay cả khi số thứ tự không bao giờ được chèn vào bảng. Hàm NEXT VALUE FOR có thể được sử dụng làm giá trị mặc định cho một cột trong định nghĩa bảng. Sử dụng sp_sequence_get_range để nhận một loạt các số thứ tự cùng một lúc.

Một chuỗi có thể được định nghĩa là bất kỳ kiểu dữ liệu số nguyên nào. Nếu kiểu dữ liệu không được chỉ định, một chuỗi sẽ được mặc định là bigint.


21

Trình tự và danh tính đều được sử dụng để tạo số tự động nhưng sự khác biệt chính là Danh tính là một bảng phụ thuộc và Trình tự độc lập với bảng.

Nếu bạn gặp trường hợp bạn cần duy trì một số tự động trên toàn cầu (trong nhiều bảng), bạn cũng cần khởi động lại khoảng thời gian của mình sau một số cụ thể và bạn cũng cần lưu vào bộ nhớ cache để thực hiện, đây là nơi chúng ta cần trình tự và không danh tính.


14

Mặc dù các chuỗi cung cấp tính linh hoạt hơn các cột nhận dạng, tôi không thấy chúng có bất kỳ lợi ích nào về hiệu suất.

Tôi nhận thấy hiệu suất sử dụng danh tính luôn nhanh hơn gấp 3 lần so với sử dụng trình tự để chèn hàng loạt.

Tôi đã chèn khoảng 1,5 triệu hàng và hiệu suất là:

  • 14 giây cho danh tính
  • 45 giây cho trình tự

Tôi đã chèn các hàng vào một bảng đã sử dụng đối tượng chuỗi thông qua mặc định bảng:

NEXT VALUE for <seq> for <col_name>

và cũng đã thử chỉ định giá trị trình tự trong câu lệnh select:

SELECT NEXT VALUE for <seq>, <other columns> from <table>

Cả hai đều chậm hơn so với phương pháp nhận dạng. Tôi đã sử dụng tùy chọn bộ nhớ cache mặc định cho trình tự.

Bài báo được tham chiếu trong liên kết đầu tiên của Arion cho thấy hiệu suất cho việc chèn từng hàng và sự khác biệt giữa danh tính và chuỗi là 16,6 giây đến 14,3 giây cho 10.000 lần chèn.

Tùy chọn Bộ nhớ đệm có tác động lớn đến hiệu suất, nhưng nhận dạng nhanh hơn đối với khối lượng cao hơn (+ 1 triệu hàng)

Xem liên kết này để có một phân tích sâu sắc theo nhận xét của utly4life.


Kích thước bộ nhớ cache của chuỗi là bao nhiêu.
Shannon thôi việc vào

50, tăng nó không tạo ra sự khác biệt, nhưng tôi nhớ lại danh tính vẫn nhanh hơn.
Stagg

2
byobi.com/blog/2012/09/… Cung cấp một so sánh chi tiết tốt về các cấu hình khác nhau. Cho thấy việc tăng kích thước bộ nhớ đệm từ 50 lên 500 mang lại sự chênh lệch tốc độ xấp xỉ 2 lần.
ulty4life

1
Bạn có đề xuất các chuỗi chậm hơn cột nhận dạng không? Tôi có một ấn tượng ngược lại vì các chuỗi nằm trong bộ nhớ không giống như danh tính được tìm nạp từ đĩa. Phát hiện của bạn khá bất ngờ. Rất vui vì bạn đã chia sẻ.
RBT

1
với trình tự, bạn có thể tối ưu hóa hiệu suất chèn hàng loạt bằng cách sử dụng alter sequence increment by ...để chỉ cần nhường chỗ cho các hàng mới của bạn và sau đó sử dụng base + row_number () hoặc bất kỳ thứ gì cho các giá trị thực tế.
gordy

6

Tôi biết điều này hơi cũ, nhưng tôi muốn thêm một quan sát khiến tôi đau đầu.

Tôi đã chuyển từ danh tính sang trình tự để sắp xếp các chỉ mục của mình. Sau đó, tôi phát hiện ra rằng trình tự không chuyển giao với bản sao. Tôi bắt đầu gặp các vi phạm chính sau khi thiết lập sao chép giữa hai cơ sở dữ liệu vì các trình tự không đồng bộ. chỉ là điều cần chú ý trước khi bạn đưa ra quyết định.


3

Tôi thấy cách sử dụng tốt nhất của Chuỗi không phải để thay thế cột nhận dạng mà là để tạo loại trường "Số đơn hàng".

Nói cách khác, Số đơn đặt hàng được hiển thị cho người dùng cuối và có thể có các quy tắc kinh doanh cùng với nó. Bạn muốn nó là duy nhất, nhưng chỉ sử dụng Cột nhận dạng cũng không thực sự chính xác.

Ví dụ: các loại đơn đặt hàng khác nhau có thể yêu cầu một trình tự khác, vì vậy bạn có thể có một trình tự cho Đơn hàng qua Internet, trái ngược với đơn hàng nội bộ.

Nói cách khác, đừng nghĩ Sequence đơn giản là sự thay thế cho danh tính, hãy nghĩ về nó hữu ích trong những trường hợp danh tính không phù hợp với các yêu cầu kinh doanh.


1

Gần đây đã có chút gì đó để xem xét cho danh tính và trình tự. Có vẻ như MSFT hiện đề xuất trình tự nếu bạn có thể muốn giữ danh tính mà không có khoảng cách. Chúng tôi đã gặp sự cố trong đó có khoảng trống lớn trong danh tính, nhưng dựa trên tuyên bố được đánh dấu này sẽ giải thích vấn đề của chúng tôi rằng SQL đã lưu danh tính vào bộ nhớ cache và sau khi khởi động lại, chúng tôi đã mất những số đó.

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql-identity-property?view=sql-server-2017

Các giá trị liên tiếp sau khi máy chủ khởi động lại hoặc các lỗi khác - 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 khi lỗi cơ sở dữ liệu hoặc máy chủ khởi động lại. Điều này có thể dẫn đến khoảng trống trong giá trị nhận dạng khi chèn. Nếu khoảng trống không được chấp nhận thì ứng dụng nên sử dụng cơ chế riêng của nó để tạo ra các giá trị chính. Sử dụng trình tạo trình tự với tùy chọn NOCACHE có thể hạn chế khoảng trống đối với các giao dịch không bao giờ được cam kết.


1
Có một câu trả lời khá hay cho việc tại sao bạn đang bỏ qua liên kếtIDENTITY số và gặp vấn đề tương tự như liên kết được mô tả ở đây nhưng bạn có thể giới hạn nó bằng cách đặt kích thước CACHE nhỏ hơn nhưng sau đó sẽ phải đánh đổi với tốc độ. SEQUENCE
Mrphin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.