Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Hiệu suất GUID

GUID s có vẻ là một lựa chọn tự nhiên cho khóa chính của bạn - và nếu bạn thực sự phải làm, bạn có thể tranh luận để sử dụng nó cho KHÓA CHÍNH của bảng. Điều tôi thực sự khuyên bạn nên không nên làm là sử dụng GUID làm khóa phân nhóm , SQL Server thực hiện theo mặc định, trừ khi bạn yêu cầu cụ thể là không.

Bạn thực sự cần phải tách biệt hai vấn đề:

  1. khóa chính là một cấu trúc logic - một trong những khóa ứng cử viên xác định duy nhất và đáng tin cậy mọi hàng trong bảng của bạn. Đây có thể là bất cứ điều gì, thực sự - một INT , một GUID , một chuỗi - chọn những gì có ý nghĩa nhất cho tình huống của bạn.

  2. khóa phân nhóm (cột hoặc các cột xác định chỉ mục được nhóm trên bàn) - đây là một vật lý thứ liên quan đến lưu trữ và ở đây, loại dữ liệu nhỏ, ổn định, ngày càng tăng là lựa chọn tốt nhất của bạn - INT hoặc BIGINT làm tùy chọn mặc định của bạn.

Theo mặc định, khóa chính trên bảng SQL Server cũng được sử dụng làm khóa phân cụm - nhưng điều đó không cần phải như vậy! Cá nhân tôi đã thấy hiệu suất tăng đáng kể khi chia Khóa chính / cụm dựa trên GUID trước đó thành hai khóa riêng biệt - khóa chính (logic) trên GUID và khóa phân cụm (sắp xếp) trên một INT IDENTITY(1,1) cột.

Như Kimberly Tripp - Nữ hoàng lập chỉ mục - và những người khác đã nói rất nhiều lần - một GUID vì khóa phân cụm không phải là tối ưu, vì do tính ngẫu nhiên của nó, nó sẽ dẫn đến phân mảnh trang và chỉ mục lớn và nói chung là hiệu suất kém.

Có, tôi biết - có newsequentialid() trong SQL Server 2005 trở lên - nhưng thậm chí điều đó không thực sự và đầy đủ tuần tự và do đó cũng gặp phải các vấn đề tương tự như GUID - chỉ kém nổi bật hơn một chút.

Sau đó, có một vấn đề khác cần xem xét:khóa phân cụm trên bảng sẽ được thêm vào từng mục nhập trên mỗi và mọi chỉ mục không được phân cụm trên bảng của bạn - vì vậy bạn thực sự muốn đảm bảo rằng nó càng nhỏ càng tốt. Thông thường, một INT với hơn 2 tỷ hàng sẽ là đủ cho đại đa số các bảng - và so với GUID làm khóa phân cụm, bạn có thể tiết kiệm cho mình hàng trăm MB dung lượng lưu trữ trên đĩa và trong bộ nhớ máy chủ.

Tính toán nhanh - sử dụng INT so với GUID làm Khóa chính và Khóa phân cụm:

  • Bảng cơ sở với 1'000'000 hàng (3,8 MB so với 15,26 MB)
  • 6 chỉ mục không phân biệt (22,89 MB so với 91,55 MB)

TỔNG CỘNG:25 MB so với 106 MB - và đó chỉ là trên một bàn duy nhất!

Một số thực phẩm bổ sung cho sự suy nghĩ - những thứ tuyệt vời của Kimberly Tripp - hãy đọc nó, đọc nó một lần nữa, tiêu hóa nó! Đó thực sự là phúc âm lập chỉ mục của SQL Server.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mô phỏng hàm MySQL group_concat trong Microsoft SQL Server 2005?

  2. Cách tốt nhất để tạo chỉ mục trong SQL Server

  3. Đăng ký báo cáo SSRS đã kết thúc do lỗi

  4. Máy chủ SQL:Độ chính xác / Tỷ lệ thập phân đang mang lại kết quả kỳ lạ

  5. Ngày mà không có thời gian