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
在SQL Server中,UniqueIdentifier 列的特性:服務器
一,對UniqueIdentifier 變量賦值dom
1,使用NewID() 爲UniqueIdentifier賦值,函數NewID() 用於產生隨機的GUID數值。ide
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產生函數賦值。ui
例如,在Default約束中使用NewID(),爲每行數據生成隨機的惟一值this
CREATE TABLE dbo.myTable_Rand ( ColumnA uniqueidentifier DEFAULT NewID(), ColumnB int, columnC varchar(10) )
1,隨機的GUIDspa
NewID()函數產生的GUID是惟一的,可是,值的大小是隨機的,不是一個始終增長的值(ever-increasing value),SQL Sever 不保證產生的GUID比以前的GUID 大或小。若是將NewID()函數產生GUID做爲clustered index key,那麼新的數據行插入的位置是隨機的,這樣將致使Page split ,下降 IO 性能。rest
最佳的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
參考文檔: