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

在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 變量賦值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

 

參考文檔:

Uniqueidentifier vs. IDENTITY

uniqueidentifier (Transact-SQL)

NEWID (Transact-SQL)

NEWSEQUENTIALID (Transact-SQL)

相關文章
相關標籤/搜索