Sql server 主键的Sql数据类型-Sql Server?

Sql server 主键的Sql数据类型-Sql Server?,sql-server,database-design,types,Sql Server,Database Design,Types,我们应该使用哪种sql数据类型作为基数主键: int 比基特 数字的 浮动 通常,int bigint如果你认为你的行数会超过宇宙中的原子数 uniqueidentifier在您需要全局唯一键时非常有用(这些键保证在模式中的所有表中都是唯一的,甚至可能是全局唯一的(我不记得了)) 另外两个我不想使用它们不是整数类型(它们有分数,作为键没有多大意义)不在PKs中使用GUI的一个重要原因是它们对索引页的填充率太高-这种误用会显著增加I/O性能成本。guid应保留为AK,并尽可能使用int派生的PK来

我们应该使用哪种sql数据类型作为基数主键:

  • int
  • 比基特
  • 数字的
  • 浮动

  • 通常,
    int

    bigint
    如果你认为你的行数会超过宇宙中的原子数

    uniqueidentifier
    在您需要全局唯一键时非常有用(这些键保证在模式中的所有表中都是唯一的,甚至可能是全局唯一的(我不记得了))


    另外两个我不想使用它们不是整数类型(它们有分数,作为键没有多大意义)

    不在PKs中使用GUI的一个重要原因是它们对索引页的填充率太高-这种误用会显著增加I/O性能成本。guid应保留为AK,并尽可能使用int派生的PK来驱动查询。

    对于32位处理器,int可能是最有效的处理大小。

    您确实需要将两个问题分开:

    1) 主键是一个逻辑结构—唯一且可靠地标识表中某一行的候选键之一。这可以是任何东西,真的-一个INT,一个GUID,一个字符串-选择对您的场景最有意义的内容

    2) 集群键(表中定义“集群索引”的一列或多列)-这是一个与物理存储相关的东西,在这里,一个小的、稳定的、不断增加的数据类型是您最好的选择-INT或BIGINT作为默认选项

    默认情况下,SQL Server表上的主键也用作集群键-但不需要这样!我个人认为,随着时间的推移,将以前基于GUID的主聚集键拆分为两个单独的键时,性能会有很大的提高—GUID上的主(逻辑)键和单独的INT-IDENTITY(1,1)列上的聚集(排序)键

    索引碎片已降至最低级别,因此索引搜索性能得到提升-强烈推荐


    Marc

    unsigned int
    符合您特定需求的大小

    这取决于!在什么情况下?请提供更多信息…单词边界与从Int切换到BigInt所占用的空间相比,相关性较小-除非您希望行数达到数十亿,否则请保存行字节并将其花在其他地方。I/O成本是比内存访问更贵的几个订单。同意,我只是添加了另一个使用int的理由。如果您选择了一个UNIQUICKIDER,那么考虑将它变成非集群主键,否则插入可以有性能发布。int仅限于“大约2亿”。我已经通过一些日志功能达到了这个极限;)@Ken温柔-回答得很好,但如果行数大于4294967296,则bigint仍然有用
    宇宙中的行数大于原子数
    表示uint64的最大值,但有时您只需要使用bigint超过uint32的最大值。在实践中您可能会遇到两个例子:每个活着的人的数据记录都超过32位限制;类似地,将IPv6地址转换为uint需要48位(我喜欢使用其他16位作为标志或有时使用低分辨率时间戳;])这并不是Ken非常有用答案的要点,但
    bigint
    的64位最大值与宇宙中估计的原子数相差甚远,--大约10^80--即使是256位整数也无法容纳该值。:)@肯斯温特-哈哈哈,宇宙中的行数比原子数多+1!!这确实有点不准确-GUID作为PK是可以的-GUID作为集群键是DeMaster。PK本身对物理数据组织没有影响-这是群集键的工作:)除了SQL server没有未签名的数据类型。是的,完全同意Marc-只是普通人很少看到图表工具之外的东西,而且右键单击、设置PK很容易。。。