高容量SQL Server 2008的密钥数据类型?

时间:2009-05-08 14:54:40

标签: sql-server-2008 star-schema primary-key-design

我正在为高容量数据设计数据库,我想知道主键使用什么数据类型?

将会有表格分区,数据库将被集群化,并将热备故障转移到其他数据中心。

修改


表格 - 考虑多个时间段的聊天系统和多个与多个用户聊天的聊天时间和事物。

指数问题是我正在考虑的问题 - 即某些东西可能在很短的时间内产生数十亿行。即在我们改变数据库或DBA做DBA事情之前

马克 - 我与你分享你对GUID的看法 - 我不喜欢用飞行的GUID进行编码。

4 个答案:

答案 0 :(得分:4)

只要您提供一点点信息,我建议您使用 BigInt ,这将带您达到9,223,372,036,854,775,807,这是您不可能超过的数字。 (不要从INT开始,并认为当超过20亿行时,可以轻松地将其更改为BigInt。它可能(我已经完成),但可能需要很长时间,并且会导致严重的系统中断。)

Kimberly Tripp在创建聚簇索引的问题上有一系列精彩的博客文章( GUIDs as PRIMARY KEYs and/or the clustering key The Clustered Index Debate Continues ),并选择了主键(相关问题,但并不总是完全相同)。她的建议是聚集索引/主键应该是:

  1. 唯一(否则无用作为密钥)
  2. 缩小(该密钥用于所有非聚集索引和外键关系)
  3. 静态(您不想更改所有相关记录)
  4. 始终增加(因此新记录总是会添加到表格的末尾,而不必插入中间)
  5. 如果您使用BigInt作为增加的身份作为您的密钥和聚集索引,那么它应该满足所有这四个要求。

    编辑:Kimberly上面提到的文章( GUIDs as PRIMARY KEYs and/or the clustering key )讨论了为什么(客户端生成的)GUID是群集密钥的错误选择:

      

    但是,GUID不是顺序的 -   就像有价值观的人一样   在客户端生成(使用.NET)   或者由newid()函数生成   (在SQL Server中)可能非常糟糕   选择 - 主要是因为   它创造的碎片化   基表也因为它   尺寸。这是不必要的宽(它是4   时间宽于基于int的身份    - 它可以为您提供20亿(真正的,40亿)唯一行。和,   如果你需要超过20亿   总是可以使用bigint(8字节   int)并获得263-1行。

    SQL有一个名为NEWSEQUENTIALID()的函数,它允许您生成可避免碎片问题的顺序GUID,但它们仍然存在不必要的宽泛问题。

答案 1 :(得分:1)

您可以随时选择 int ,但考虑到您的分区/群集我建议您查看 uniqueidentifier ,这将生成全局唯一的密钥。

答案 2 :(得分:1)

int往往是常态,除非您需要大量数据,并且具有使用IDENTITY等的优势;如果您希望数字不可猜测或可导出,Guid有一些优势,但如果您使用Guid(除非您自己将其生成为“精梳”),您应该确保它是非群集的(索引,即;不是服务器场),因为它不是增量的。

答案 3 :(得分:0)

我认为int会非常​​好。

  

INTEGER的范围是 - 2147483648到2147483647。

您也可以使用UniqueIdentifier(GUID),但在这种情况下

  • MSSQL中的表行大小限制
  • 存储+内存。想象一下,你有10000000行的表并且正在增长
  • 灵活性:有一些T-SQL运营商可用于INT,例如>,<,=等......
  • GUID未针对ORDER BY / GROUP BY查询和一般范围查询进行优化