WEB开发网
开发学院数据库MSSQL Server 使用uniqueidentifier还是IDENTITY生成主键? 阅读

使用uniqueidentifier还是IDENTITY生成主键?

 2008-10-28 10:09:24 来源:WEB开发网   
核心提示: 通过观察NEWSEQUENTIALID()测试表,我们不难发现它产生的页数比NEWID()方法产生的少,使用uniqueidentifier还是IDENTITY生成主键?(4),但仍然比IDENTITY方法产生的多,这是为什么呢?这是因为唯一标识符数据类型消耗16字节的磁盘空间,l 存在系

通过观察NEWSEQUENTIALID()测试表,我们不难发现它产生的页数比NEWID()方法产生的少,但仍然比IDENTITY方法产生的多。这是为什么呢?这是因为唯一标识符数据类型消耗16字节的磁盘空间,而不是像IDENTITY方法那样只使用4个字节的整数数据类型。考虑到SQL Server页通常限制在8K或者大约8060字节(因为在SQL Server 2005中有一种行溢出机制来解决这个问题,不过这是题外话),这造成的后果是:

NEWSEQUENTIALID()方法产生更多的页而不是IDENTITY方法产生更多的页。

通过查看使用的数据库表空间,我们看到使用IDENTITY方法的表使用最少量的磁盘空间:

  execsp_spaceusedIDENTITY_TEST1
  GO
  execsp_spaceusedIDENTITY_TEST2
  GO
  execsp_spaceusedIDENTITY_TEST3
  GO
  execsp_spaceusedNEWID_TEST
  GO
  execsp_spaceusedNEWSEQUENTIALID_TEST
  GO

使用uniqueidentifier还是IDENTITY生成主键?

现在也来考虑这个问题,因为唯一标识符数据类型消耗16字节的数据,任何在一张表中使用一个全球唯一识别码作为聚集索引的定义非聚集索引大小都会受到影响,因为这些非聚集索引的叶级别包含作为指示器的聚集索引键。因此,如果一个IDENTITY被定义为整数或者bigint数据类型,那么任何非聚集索引的大小可能会因为比较大而终止。

很明显,使用IDENTITY来自动生成键值比使用全球唯一标识符方法更具有优势:

l IDENTITY生成值是可以配置的,并且易于阅读,易于在工作中使用。

l 可以使用更少的数据库页来满足查询请求。

l 与NEWID()方法相比,它在页拆分(与前面相关)方面的担忧可以消除。

l 数据库规模最小化。

l 存在系统函数来获得最后生成的IDENTITY值(比如SCOPE_IDENTITY()等)

一些系统函数,比如MIN()和MAX(),不能在唯一标识符字段中使用。

上一页  1 2 3 4 

Tags:使用 uniqueidentifier 还是

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接