Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

NEWID() vs NEWSEQUENTIALID() di SQL Server:Apa Bedanya?

Di SQL Server, keduanya NEWSEQUENTIALID() fungsi dan NEWID() fungsi membuat GUID (Pengidentifikasi Unik Global), juga dikenal sebagai UUID (Pengidentifikasi Unik Universal).

GUID dapat digunakan sebagai pengidentifikasi unik di kolom tipe pengidentifikasi unik , sehingga kedua fungsi tersebut dapat digunakan untuk tujuan tersebut.

Namun, ada perbedaan antara kedua fungsi ini yang dapat memengaruhi keputusan Anda untuk menggunakan salah satunya.

Perbedaan

Berikut adalah perbedaan utama antara kedua fungsi tersebut.

BARU() NESEQUENTIALID() GUID Membuat GUID acak. Membuat GUID berurutan. Pendekatan GUID sesuai dengan RFC 4122 versi 4, yang menetapkan bahwa GUID dibuat secara acak atau pseudo-acak. Membuat GUID yang lebih besar daripada GUID yang dihasilkan sebelumnya oleh fungsi ini pada komputer tertentu sejak Windows dimulai. Setelah memulai ulang Windows, GUID dapat memulai lagi dari rentang yang lebih rendah, tetapi masih unik secara global. Jenis Pengembalian pengidentifikasi unik pengidentifikasi unik Penggunaan Dapat digunakan dalam kueri ad-hoc, tabel, variabel, dll Hanya dapat digunakan dengan DEFAULT batasan pada kolom tabel dengan tipe pengidentifikasi unik . Kinerja Bisa lebih lambat dari NEWSEQUENTIALID() , karena NEWID() menyebabkan aktivitas acak dan menggunakan lebih sedikit halaman data yang di-cache. Bisa lebih cepat dari NEWID() , karena NEWID menyebabkan aktivitas acak dan menggunakan lebih sedikit halaman data yang di-cache. Menggunakan NEWSEQUENTIALID() juga membantu mengisi data dan halaman indeks sepenuhnya. Keamanan Lebih aman, karena GUID dibuat secara acak, dan lebih sulit ditebak. Kurang aman. Anda dapat menebak nilai GUID yang dihasilkan berikutnya dan, oleh karena itu, mengakses data yang terkait dengan GUID tersebut.

Saya yakin ada banyak perbedaan lain di baliknya, tetapi ini adalah perbedaan utama dari sudut pandang pengguna.

Contoh 1 – Membandingkan GUID

Berikut adalah contoh cepat untuk menunjukkan perbedaan dalam GUID yang dihasilkan masing-masing fungsi ini.

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

Hasil:

+--------------------------------------+--------------------------------------+
| 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 |
+--------------------------------------+--------------------------------------+

Kita dapat melihat bahwa NEWSEQUENTIALID() kolom bertambah secara berurutan, sedangkan NEWID() kolom tampaknya acak.

Kedua kolom berisi GUID dan keduanya adalah pengidentifikasi unik jenis.

Pada NEWID() kolom, kita dapat melihat bahwa semua nilai adalah RFC 4122 versi/(sub-tipe) 4, yang menentukan bahwa GUID dihasilkan secara acak atau pseudo-acak. Kami tahu ini versi 4 karena 4 ada di tempat yang relevan (semua baris berbentuk: xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx ).

Contoh 2 – Penggunaan dalam Kueri

Seperti yang disebutkan, hanya NEWID() dapat digunakan dalam query.

Misalnya, Anda dapat melakukan ini:

SELECT NEWID() AS [NEWID()];

Hasil:

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

Tapi Anda tidak bisa melakukan ini:

SELECT NEWSEQUENTIALID() AS [NEWSEQUENTIALID()];

Hasil:

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. Bagaimana Transaksi Implisit Bekerja di SQL Server

  2. Apakah mungkin untuk melakukan banyak pembaruan dengan satu pernyataan SQL UPDATE?

  3. cara menemukan ukuran baris dalam tabel

  4. Kode untuk memvalidasi Skrip SQL

  5. SQL Dinamis vs Prosedur Tersimpan