UniqueIdentifier 數據類型 和 GUID 生成函數


UniqueIdentifier 數據類型用於存儲GUID的值,占用16Byte。 SQL Server把UniqueIdentifier存儲為16個固定字節的二進制數值,Binary(16),按照特定的格式顯示,顯示的格式是:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,其中,x是一個16進制數字,數值范圍是從0-9,A-F。由於每個字節存儲2個16進制數據,因此,按照存儲字節,UniqueIdentifier的格式簡寫為:4B-2B-2B-2B-6B。使用GUID的好處是:在不同的Server上,實現GUID數值的“唯一”,SQL Server保證GUID的值總是唯一的,只在極少數情況下可能會重復。

在SQL Server中,UniqueIdentifier 列的特性:

  • 系統不會自動為UniqueIdentifier列賦值,必須顯式賦值;
  • 使用GUID產生函數 NewID()賦值,產生隨機的GUID;
  • NewSequentialID() 函數只能用於表列的Default約束中,產生順序的GUID;
  • 使用字符串常量賦值,字符串常量的格式是:'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',x是16進制數字,數值范圍是從0-9,A-F;
  • UniqueIdentifier 值能夠比較大小,能夠使用is null 或 is not null 操作符判斷是否為NULL;
  • 能夠被RowGUIDCol屬性標記,使用$ROWGUID 引用具有RowGUIDCol屬性的UniqueIdentifier列;

一,對UniqueIdentifier 變量賦值

1,使用NewID() 為UniqueIdentifier賦值,函數NewID() 用於產生隨機的GUID數值。

declare @ui uniqueidentifier
set @ui=newid()
select @ui

2,使用字符串賦值,字符串的格式是:‘xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx’

declare @ui uniqueidentifier
set @ui='AA786048-44BB-E511-80E3-F8B156CF6E62'
select @ui

二,創建UniqueIdentifier column

由於UniqueIdentifier 列不是由系統自動賦值,必須顯式賦值,可以為UniqueIdentifier列創建Default約束,並使用GUID產生函數賦值。

例如,在Default約束中使用NewID(),為每行數據生成隨機的唯一值

CREATE TABLE dbo.myTable_Rand
(
    ColumnA uniqueidentifier DEFAULT NewID(),
    ColumnB int,
    columnC varchar(10)
) 

1,隨機的GUID

NewID()函數產生的GUID是唯一的,但是,值的大小是隨機的,不是一個始終增加的值(ever-increasing value),SQL Sever 不保證產生的GUID比之前的GUID 大或小。如果將NewID()函數產生GUID作為clustered index key,那么新的數據行插入的位置是隨機的,這樣將導致Page split ,降低 IO 性能。

最佳的clustered index key 應該是遞增的(increase),data type is narrow (narrow),值是unique(unique),不會頻繁更新(static),NewID() 產生的GUID滿足narrow,unique, static,但是不滿足increase,因此不是理想中的clustered index key。

2,有序的GUID

在一台指定的服務器上,NewSequentialId() 產生的GUID是有序的,后產生的GUID比先產生的GUID數值要大,也就是說,該函數產生的GUID值是始終增加(ever-increasing value)的,SQL Sever 保證產生的GUID比之前的GUID 大。NewSequentialID()函數只能用於表列的Default約束中。如果將NewSequentialID() 產生的GUID作為clustered index key,那么Insert會將新的row 將插入到table的末尾,避免 page split,推薦使用NewSequentialID()作為clustered index key。

NewSequentialID()  Creates a GUID that is greater than any GUID previously generated by this function on a specified computer since Windows was started. After restarting Windows, the GUID can start again from a lower range, but is still globally unique. When a GUID column is used as a row identifier, using NEWSEQUENTIALID can be faster than using the NEWID function. This is because the NEWID function causes random activity and uses fewer cached data pages. Using NEWSEQUENTIALID also helps to completely fill the data and index pages.

NEWSEQUENTIALID() can only be used with DEFAULT constraints on table columns of type uniqueidentifier. You can use NEWSEQUENTIALID to generate GUIDs to reduce page splits and random IO at the leaf level of indexes. Each GUID generated by using NEWSEQUENTIALID is unique on that computer.

CREATE TABLE dbo.myTable ( ColumnA uniqueidentifier DEFAULT NEWSEQUENTIALID(), ColumnB int, columnC varchar(10) )  insert into dbo.myTable(ColumnB,columnC) values(1,'a'),(2,'c')

三,ROWGUIDCOL 屬性

ROWGUIDCOL 屬性用於標記一個表列是 UniqueIdentifier 列,如果一個表列被標記為RowGUIDCol,那么可以使用 $ROWGUID 來引用該列 ,一個表只能有一列具有RowGUIDCol屬性,該屬性僅有的作用是:指定 $ROWGUID 引用的UniqueIdentifier列。

CREATE TABLE dbo.myTable_RowGUIDCol
(
    ColumnA uniqueidentifier ROWGUIDCOL not null
            constraint DF__myTable_RowGUIDCol_ColumnA DEFAULT NewID(),
    ColumnB int,
    columnC varchar(10)
) 

引用$ROWGUID查看被標記為RowGUIDCol 的column

select $ROWGUID
from dbo.myTable_RowGUIDCol

 

參考文檔:

Uniqueidentifier vs. IDENTITY

uniqueidentifier (Transact-SQL)

NEWID (Transact-SQL)

NEWSEQUENTIALID (Transact-SQL)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM