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

NEWID () so với NEWSEQUENTIALID () trong SQL Server:Sự khác biệt là gì?

Trong SQL Server, cả NEWSEQUENTIALID()NEWID() chức năng tạo GUID (Bộ nhận dạng duy nhất toàn cầu), còn được gọi là UUID (Bộ nhận dạng duy nhất toàn cầu).

GUID có thể được sử dụng làm số nhận dạng duy nhất trong các cột thuộc loại mã định danh duy nhất , vì vậy cả hai hàm đều có thể được sử dụng cho mục đích đó.

Tuy nhiên, có sự khác biệt giữa hai chức năng này có thể ảnh hưởng đến quyết định sử dụng chức năng này so với chức năng kia.

Sự khác biệt

Dưới đây là sự khác biệt chính giữa hai chức năng này.

NEWID () NEWSEQUENTIALID ()
HƯỚNG DẪN Tạo một GUID ngẫu nhiên. Tạo GUID tuần tự.
Phương pháp tiếp cận GUID tuân theo RFC 4122 phiên bản 4, chỉ định rằng GUID được tạo ngẫu nhiên hoặc giả ngẫu nhiên. Tạo GUID lớn hơn bất kỳ GUID nào được tạo bởi chức năng này trước đây trên một máy tính được chỉ định kể từ khi khởi động Windows. Sau khi khởi động lại Windows, GUID có thể bắt đầu lại từ phạm vi thấp hơn, nhưng vẫn là duy nhất trên toàn cầu.
Loại trả lại uniqueidentifier uniqueidentifier
Cách sử dụng Có thể sử dụng trong các truy vấn đặc biệt, bảng, biến, v.v. Chỉ có thể sử dụng với DEFAULT ràng buộc đối với các cột của bảng thuộc loại uniqueidentifier .
Hiệu suất Có thể chậm hơn NEWSEQUENTIALID() , bởi vì NEWID() gây ra hoạt động ngẫu nhiên và sử dụng ít trang dữ liệu được lưu trong bộ nhớ cache hơn. Có thể nhanh hơn NEWID() , bởi vì NEWID gây ra hoạt động ngẫu nhiên và sử dụng ít trang dữ liệu được lưu trong bộ nhớ cache hơn. Sử dụng NEWSEQUENTIALID() cũng giúp lấp đầy hoàn toàn các trang dữ liệu và chỉ mục.
Bảo mật An toàn hơn, vì GUID được tạo ngẫu nhiên và khó đoán hơn. Kém an toàn hơn. Có thể đoán giá trị của GUID được tạo tiếp theo và do đó, truy cập vào dữ liệu được liên kết với GUID đó.

Tôi chắc chắn rằng có rất nhiều điểm khác biệt khác, nhưng đây là những điểm khác biệt chính theo quan điểm của người dùng.

Ví dụ 1 - So sánh các GUID

Dưới đây là một ví dụ nhanh để chứng minh sự khác biệt trong GUID mà mỗi chức năng này tạo ra.

CREATE TABLE GUIDTest
(
    NewIdCol uniqueidentifier NOT NULL DEFAULT NEWID(),
    NewSequentialIdCol uniqueidentifier NOT NULL DEFAULT NEWSEQUENTIALID(),
);
GO

INSERT GUIDTest (NewIdCol, NewSequentialIdCol)
VALUES (DEFAULT, DEFAULT);
GO 20

SELECT 
  NewIdCol AS [NEWID()],
  NewSequentialIdCol AS [NEWSEQUENTIALID()]
FROM GUIDTest;
GO

Kết quả:

+--------------------------------------+--------------------------------------+
| NEWID()                              | NEWSEQUENTIALID()                    |
|--------------------------------------+--------------------------------------|
| 965320de-8997-4e37-8fe9-a7daa52b04aa | 246f433e-f36b-1410-8a80-007d2b533547 |
| 5c038bef-c2e1-4558-bd91-49b98fde5c71 | 266f433e-f36b-1410-8a80-007d2b533547 |
| e7cfba90-78b6-4360-87a8-0b392fd227e5 | 286f433e-f36b-1410-8a80-007d2b533547 |
| 9bf5b052-7023-4f52-939e-b5fb8f8ea27a | 2a6f433e-f36b-1410-8a80-007d2b533547 |
| ccb38891-3689-42ed-91f2-79ddf0abeb2f | 2c6f433e-f36b-1410-8a80-007d2b533547 |
| 8646ab08-6e4b-4cd6-9b25-ec0440c0f7f3 | 2e6f433e-f36b-1410-8a80-007d2b533547 |
| f14e18a5-669a-4a2d-8793-42b705fc134f | 306f433e-f36b-1410-8a80-007d2b533547 |
| 09ec2418-cfa0-4c8b-9b08-78e6f7946488 | 326f433e-f36b-1410-8a80-007d2b533547 |
| 3ca2b71c-5f84-4db9-aa0f-fb9f215ceb09 | 346f433e-f36b-1410-8a80-007d2b533547 |
| ccaed0a6-5851-472d-8b6a-db29581f2a43 | 366f433e-f36b-1410-8a80-007d2b533547 |
| be6f9d97-7c86-4e43-9127-1aaa0c75d8b5 | 386f433e-f36b-1410-8a80-007d2b533547 |
| b4c7b9e9-6f0c-44fc-904b-1aae2dfd20f9 | 3a6f433e-f36b-1410-8a80-007d2b533547 |
| 378b2be8-b368-462f-ad30-896b67974b11 | 3c6f433e-f36b-1410-8a80-007d2b533547 |
| 390c58ce-8d5c-454b-8c80-e0a690f113b9 | 3e6f433e-f36b-1410-8a80-007d2b533547 |
| 4d2d9c64-bf04-44d2-bee3-4a2a33da05bd | 406f433e-f36b-1410-8a80-007d2b533547 |
| 87e73722-bc1c-43f1-b94d-c89053bdc408 | 426f433e-f36b-1410-8a80-007d2b533547 |
| 2caf72a0-4a19-4743-b299-99610d44aab2 | 446f433e-f36b-1410-8a80-007d2b533547 |
| 3ed0dd28-19d5-44f5-90dc-6ded08269b37 | 466f433e-f36b-1410-8a80-007d2b533547 |
| ce768fd8-df02-4d8f-afd4-a62d04571713 | 486f433e-f36b-1410-8a80-007d2b533547 |
| 6ca41865-bbee-418a-aa6d-582a4541119d | 4a6f433e-f36b-1410-8a80-007d2b533547 |
+--------------------------------------+--------------------------------------+

Chúng ta có thể thấy rằng NEWSEQUENTIALID() cột đang tăng dần theo kiểu tuần tự, trong khi NEWID() cột dường như là ngẫu nhiên.

Cả hai cột đều chứa GUID và chúng là mã định danh duy nhất hợp lệ các loại.

Trên NEWID() , chúng ta có thể thấy rằng tất cả các giá trị đều là phiên bản RFC 4122 / (loại phụ) 4, chỉ định rằng GUID được tạo ngẫu nhiên hoặc giả ngẫu nhiên. Chúng tôi biết đó là phiên bản 4 vì 4 ở vị trí phù hợp (tất cả các hàng có dạng: xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx ).

Ví dụ 2 - Sử dụng trong Truy vấn

Như đã đề cập, chỉ NEWID() có thể được sử dụng trong các truy vấn.

Ví dụ:bạn có thể làm điều này:

SELECT NEWID() AS [NEWID()];

Kết quả:

+--------------------------------------+
| NEWID()                              |
|--------------------------------------|
| ba07340c-6308-44d0-8c4b-52ed5e4a1601 |
+--------------------------------------+

Nhưng bạn không thể làm điều này:

SELECT NEWSEQUENTIALID() AS [NEWSEQUENTIALID()];

Kết quả:

Msg 302, Level 16, State 0, Line 1
The newsequentialid() built-in function can only be used in a DEFAULT expression for a column of type 'uniqueidentifier' in a CREATE TABLE or ALTER TABLE statement. It cannot be combined with other operators to form a complex scalar expression.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi ‘datetimeoffset’ thành ‘date’ trong SQL Server (Ví dụ T-SQL)

  2. WinRT System.Data - Kết nối với SQL

  3. Câu lệnh CASE WHEN cho mệnh đề ORDER BY

  4. Tạo cột được tính toán bằng cách sử dụng dữ liệu từ một bảng khác

  5. ATN2 () Ví dụ trong SQL Server