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

Thuật toán sắp xếp GUID của SQL Server. Tại sao?

Thuật toán được tài liệu bởi các bạn SQL Server ở đây:Các GUID được so sánh như thế nào trong SQL Server 2005? Tôi Trích dẫn ở đây (vì đó là một bài báo cũ có thể sẽ ra đi vĩnh viễn sau một vài năm)

Nói chung, các so sánh bình đẳng có ý nghĩa rất nhiều với các giá trị đơn vị xác định (uniqueidentifier). Tuy nhiên, nếu bạn thấy mình cần sắp xếp thứ tự chung thì có thể bạn đang xem sai kiểu dữ liệu và thay vào đó, bạn nên xem xét các kiểu số nguyên khác nhau.

Nếu sau khi suy nghĩ cẩn thận, bạn quyết định đặt hàng trên một cột bảo mật duy nhất, bạn có thể ngạc nhiên bởi những gì bạn nhận lại được.

Đưa ra hai giá trị mã định danh duy nhất sau:

@ g1 ='55666BEE-B3A0-4BF5-81A7-86FF976E763F' @ g2 ='8DD5BCA5-6ABE-4F73-B4B7-393AE6BBB849'

Nhiều người nghĩ rằng @ g1 nhỏ hơn @ g2, vì '55666BEE' chắc chắn nhỏ hơn '8DD5BCA5'. Tuy nhiên, đây không phải là cách SQL Server2005 so sánh các giá trị mã định danh duy nhất.

Việc so sánh được thực hiện bằng cách xem xét các "nhóm" byte từ phải sang trái và từ trái sang phải trong một "nhóm" byte. Nhóm byte là những gì được phân tách bằng ký tự '-'. Về mặt kỹ thuật, chúng tôi xem xét các byte {10 đến 15} trước tiên, sau đó {8-9}, sau đó {6-7}, sau đó {4-5} và cuối cùng là {0 đến 3}.

Trong ví dụ cụ thể này, chúng tôi sẽ bắt đầu bằng cách so sánh '86FF976E763F'với' 393AE6BBB849 '. Ngay lập tức, chúng tôi thấy rằng @ g2 thực sự lớn hơn @ g1.

Lưu ý rằng trong các ngôn ngữ .NET, các giá trị Guid có thứ tự sắp xếp mặc định khác với trong SQL Server. Nếu bạn thấy cần đặt hàng một mảng hoặc danh sách Hướng dẫn sử dụng ngữ nghĩa so sánh SQL Server, bạn có thể sử dụng anarray hoặc danh sách SqlGuid để thay thế, sẽ triển khai ICompABLE ngay, phù hợp với ngữ nghĩa của SQL Server.

Ngoài ra, việc sắp xếp theo độ bền của nhóm byte (xem tại đây:Định danh duy nhất trên toàn cầu). Các nhóm 10-15 và 8-9 được lưu trữ dưới dạng big endian (tương ứng với Data4 trong bài viết trên wikipedia), vì vậy chúng được so sánh như big endian. Các nhóm khác được so sánh bằng cách sử dụng endian nhỏ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Không thể sử dụng vị từ CONTAINS hoặc FREETEXT trên bảng hoặc chế độ xem được lập chỉ mục vì nó không được lập chỉ mục toàn văn bản

  2. Cập nhật cột đếm từ dữ liệu trong bảng khác

  3. Máy chủ SQL SHOWPLAN_ALL

  4. Cách nhanh nhất để thực hiện chèn hàng loạt lồng nhau với việc sử dụng scope_identity ()?

  5. Máy chủ SQL CHỌN VÀO @variable?