5

Tôi đang làm việc về các tiêu chuẩn cơ sở dữ liệu cho một cơ sở dữ liệu mới mà công ty của tôi đang bắt đầu. Một trong những điều chúng tôi đang cố gắng xác định là các quy tắc Primary Key và Clustered Index liên quan đến UniqueIdentifiers.NewSequentialId trên UniqueIdentifier Clustered Index

(LƯU Ý: Tôi không muốn thảo luận về ưu và khuyết điểm của việc sử dụng UniqueIdentifier làm khóa chính hoặc chỉ mục nhóm. Có rất nhiều thông tin trên web về điều đó.)

vì vậy, đây là kịch bản có tôi lo lắng:

nói rằng tôi có một bảng với một UniqueIdentifier như chỉ số clustered và khóa chính. Cho phép gọi nó là ColA. Tôi đặt giá trị mặc định cho ColA thành NewSequentialId().

Sử dụng rằng NewSequentialId() tôi chèn ba hàng tuần tự:

{72586AA4-D2C3-440D-A9FE-CC7988DDF065}
{72586AA4-D2C3-440D-A9FE-CC7988DDF066}
{72586AA4-D2C3- 440D-A9FE-CC7988DDF067}

Sau đó, tôi khởi động lại máy chủ của mình. Các docs for NewSequentialId nói rằng "Sau khi khởi động lại Windows, GUID có thể bắt đầu lại từ một phạm vi thấp hơn, nhưng vẫn còn duy nhất trên toàn cầu."

Vì vậy, điểm bắt đầu tiếp theo có thể thấp hơn phạm vi trước đó.

Vì vậy, sau khi khởi động lại, tôi chèn thêm 3 giá trị:

{35729A0C-F016-4645-ABA9-B098D2003E64}
{35729A0C-F016-4645-ABA9-B098D2003E65}
{35729A0C-F016- 4645-ABA9-B098D2003E66}

(Tôi không biết chính xác hướng dẫn được thể hiện trong cơ sở dữ liệu như thế nào, nhưng cho phép giả định vì câu lệnh này bắt đầu bằng 3 và những cái trước bắt đầu bằng 7, 3 cái nhỏ hơn 7 cái.)

Khi bạn thực hiện thao tác chèn ở giữa một chỉ số nhóm, việc tái bản chỉ mục đã xảy ra. (Ít nhất là DBA của tôi đã nói với tôi.) Và mỗi khi tôi khởi động lại tôi chạy nguy cơ có phạm vi UniqueIdentifier mới của tôi được quyền ở giữa các phạm vi trước đó khác.

Vì vậy, câu hỏi của tôi là: Vì tập hợp UniqueIdentifier tiếp theo sẽ nhỏ hơn tập hợp cuối cùng, mọi chèn sẽ khiến chỉ mục nhóm của tôi bị xáo trộn?

Và nếu không, tại sao? Liệu SQL Server biết rằng tôi đang sử dụng NewSequentialId? Liệu nó có bù đắp như thế nào không?

Nếu không, thì làm cách nào để biết tôi sẽ chèn gì tiếp theo? Có lẽ hàng triệu lần chèn tiếp theo sẽ bắt đầu bằng 3. Hoặc có thể họ sẽ bắt đầu bằng 7. Làm thế nào để biết?

Hoặc không biết và chỉ giữ mọi thứ theo thứ tự. Nếu đó là trường hợp thì một khởi động lại có thể ảnh hưởng lớn đến hiệu suất. (Mà làm cho tôi nghĩ rằng tôi cần NewSequentialId tùy chỉnh của riêng tôi mà không bị ảnh hưởng bởi khởi động lại.) Có đúng không? Hoặc là có một số phép thuật mà tôi không biết?

CHỈNH SỬA: HƯỚNG DẪN làm chỉ mục nhóm được khuyến khích mạnh mẽ trong tiêu chuẩn của tôi. Như tôi đã nói ở trên, có nhiều lý do khiến đây là một ý tưởng tồi. Tôi đang cố gắng tìm hiểu xem đây có phải là một lý do khác hay không.

+0

"Nếu trường hợp đó xảy ra thì một lần khởi động lại có thể ảnh hưởng lớn đến hiệu suất." - đó là lý do tại sao bạn muốn sử dụng một IDENTITY(), mặc dù bạn không muốn nghe nó. – HardCode

Trả lời

1

Thông thường, bạn sẽ tạo các chỉ mục của mình với FILL FACTOR thích hợp để không gian trống trong tất cả các trang của bạn chỉ với một trường hợp như vậy. Điều đó đang được nói, chỉ số nhóm được sắp xếp lại khi không gian trống được lấp đầy.

Tôi biết bạn không muốn thảo luận sử dụng GUID làm khóa nhóm, nhưng đây là một trong những lý do khiến đó không phải là phương pháp được khuyến nghị.

Điều sẽ xảy ra là bạn sẽ có khối lượng phân tách trang càng tăng, điều này sẽ dẫn đến phân đoạn rất cao khi bạn tiếp tục chèn hàng và bạn sẽ cần xây dựng lại chỉ mục của mình ở tần suất cao hơn hiệu suất trong dòng.

Đối với một điều trị đầy đủ về chủ đề này, có nguồn không tốt hơn so với

Kim
Tripp's
Blog

Là một mặt lưu ý, khi bạn đang xem xét việc tạo ra chức năng tạo NewSequentialID của riêng bạn, bạn có thể có vấn đề về thiết kế và nên xem xét lại kế hoạch của bạn.

+0

Tôi đã đọc một số bài đăng của cô ấy rồi. GUID như một chỉ số nhóm được khuyến khích mạnh mẽ trong tiêu chuẩn của tôi. Tôi đang cố gắng xây dựng một trường hợp cho lý do tại sao. (Do đó câu hỏi này.) – Vaccano

+0

Sau khi đạt được hệ số lấp đầy, mỗi lần chèn có gây ra sắp xếp lại không? – Vaccano

+0

Nó phụ thuộc. Yếu tố lấp đầy là theo trang, vì vậy khi trang đầy thì có. Tất cả các lần chèn tiếp theo sẽ gây ra sắp xếp lại nếu trang mà chúng cần chèn vào đã đầy. – JNK

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