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

Hướng dẫn EF 4.0 hoặc Int làm khóa chính

Tôi sẽ đồng ý 100% với bạn - sử dụng INT IDENTITY tốt hơn nhiều!

GUID 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 như vậy, 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 sử dụng cột 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ứ thứ gì, thực sự - INT, GUID, một chuỗi - chọn những gì có ý nghĩa nhất cho kịch bản của bạn.

2) khóa phân cụm (cột hoặc các cột xác định "chỉ mục được phân nhóm" trên bảng) - đây là 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 riêng biệt (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à 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. Xử lý NULL trong SQL Server

  2. SQL Server 2016:Tác động đến hiệu suất của Luôn được mã hóa

  3. danh sách các bảng không có chỉ mục trong sql 2008

  4. Sự cố thông thạo NHibernate với Giá trị cột DATE của SQL Server 2008

  5. Giá trị thập lục phân 0x00 là một ký tự không hợp lệ