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
参考文档: