Không có gì sai với GUID vì các khóa và cụm trong hệ thống OLTP (trừ khi bạn có RẤT NHIỀU chỉ mục trên bảng chịu kích thước tăng của cụm). Như một vấn đề thực tế, chúng có khả năng mở rộng hơn nhiều so với các cột IDENTITY.
Có một niềm tin phổ biến rằng GUID là một vấn đề lớn trong SQL Server - phần lớn, điều này khá đơn giản là sai. Thực tế, GUID có thể mở rộng đáng kể trên các hộp có nhiều hơn 8 lõi:
Tôi xin lỗi, nhưng các nhà phát triển của bạn là đúng. Lo lắng về những điều khác trước khi bạn lo lắng về GUID.
Oh, và cuối cùng: tại sao bạn muốn một chỉ số cụm ở vị trí đầu tiên? Nếu mối quan tâm của bạn là một hệ thống OLTP với rất nhiều chỉ mục nhỏ, bạn có khả năng tốt hơn với một đống.
Bây giờ chúng ta hãy xem xét phân mảnh (mà GUID sẽ giới thiệu) làm gì cho bài đọc của bạn. Có ba vấn đề lớn với sự phân mảnh:
- Trang chia tách chi phí đĩa I / O
- Một nửa trang đầy đủ không hiệu quả như bộ nhớ đầy đủ
- Nó khiến các trang được lưu trữ không theo thứ tự, điều này làm cho I / O tuần tự ít có khả năng
Vì mối quan tâm của bạn trong câu hỏi là về khả năng mở rộng, mà chúng tôi có thể định nghĩa là "Thêm nhiều phần cứng giúp hệ thống hoạt động nhanh hơn", đây là những vấn đề ít nhất của bạn. Để giải quyết lần lượt từng người
Quảng cáo 1) Nếu bạn muốn quy mô, thì bạn có thể đủ khả năng để mua I / O. Ngay cả một ổ SSD Samsung / Intel 512GB giá rẻ (với một vài USD / GB) sẽ giúp bạn kiếm được hơn 100 nghìn IOPS. Bạn sẽ không tiêu thụ bất cứ lúc nào sớm trên hệ thống 2 ổ cắm. Và nếu bạn gặp phải điều đó, hãy mua thêm một cái nữa và bạn đã được thiết lập
Quảng cáo 2) Nếu bạn xóa trong bảng của mình, bạn sẽ có một nửa trang đầy đủ. Và ngay cả khi bạn không, bộ nhớ là rẻ và cho tất cả trừ các hệ thống OLTP lớn nhất - dữ liệu nóng sẽ phù hợp ở đó. Tìm cách để đóng gói nhiều dữ liệu hơn vào các trang là tối ưu hóa phụ khi bạn đang tìm kiếm tỷ lệ.
Quảng cáo 3) Một bảng được xây dựng từ việc phân chia trang thường xuyên, dữ liệu bị phân mảnh cao thực hiện I / O ngẫu nhiên với tốc độ chính xác như một bảng được điền tuần tự
Liên quan đến việc tham gia, có hai loại tham gia chính mà bạn có thể thấy trong OLTP như khối lượng công việc: Hash và vòng lặp. Hãy nhìn lần lượt từng cái:
Tham gia băm: Một tham gia băm giả định rằng bảng nhỏ được quét và bảng lớn hơn thường được tìm kiếm. Các bảng nhỏ rất có khả năng nằm trong bộ nhớ, vì vậy I / O không phải là mối quan tâm của bạn ở đây. Chúng tôi đã chạm vào thực tế rằng các tìm kiếm có cùng chi phí trong chỉ mục phân mảnh như trong một chỉ mục không phân mảnh
Vòng lặp tham gia: Bảng bên ngoài sẽ được tìm kiếm. Cùng chi phí
Bạn cũng có thể có nhiều quá trình quét bảng xấu đang diễn ra - nhưng sau đó GUID không phải là mối quan tâm của bạn, lập chỉ mục phù hợp là.
Bây giờ, bạn có thể có một số lần quét phạm vi hợp pháp đang diễn ra (đặc biệt là khi tham gia khóa ngoại) và trong trường hợp này, dữ liệu bị phân mảnh ít bị "đóng gói" hơn so với dữ liệu không bị phân mảnh. Nhưng hãy để chúng tôi xem xét những gì tham gia mà bạn có thể sẽ thấy trong dữ liệu 3NF được lập chỉ mục tốt là:
Tham gia từ một bảng có tham chiếu khóa ngoài đến khóa chính của bảng mà nó tham chiếu
Cách khác xung quanh
Quảng cáo 1) Trong trường hợp này, bạn sẽ tìm kiếm một khóa chính - nối n đến 1. Phân mảnh hoặc không, cùng một chi phí (một tìm kiếm)
Quảng cáo 2) Trong trường hợp này, bạn đang tham gia cùng một khóa, nhưng có thể truy xuất nhiều hơn một hàng (phạm vi tìm kiếm). Tham gia trong trường hợp này là 1 đến n. Tuy nhiên, bảng nước ngoài bạn tìm kiếm, bạn đang tìm kiếm khóa SAME, có khả năng giống như trên cùng một trang trong một chỉ mục bị phân mảnh như trên một bảng không bị phân mảnh.
Hãy xem xét các khóa ngoại trong một thời điểm. Ngay cả khi bạn có tuần tự "hoàn hảo" đã đặt các khóa chính của chúng tôi - mọi thứ chỉ vào khóa đó vẫn sẽ không tuần tự.
Tất nhiên, bạn có thể đang chạy trên một máy ảo trong một số SAN ở một số ngân hàng rẻ tiền và có quy trình cao. Sau đó tất cả lời khuyên này sẽ bị mất. Nhưng nếu đó là thế giới của bạn, khả năng mở rộng có thể không phải là thứ bạn đang tìm kiếm - bạn đang tìm kiếm hiệu suất và tốc độ / chi phí cao - đó là cả hai điều khác nhau.