【问题标题】:SQL Server BIGINT or DECIMAL(18,0) for primary key主键的 SQL Server BIGINT 或 DECIMAL(18,0)
【发布时间】:2011-10-13 21:08:35
【问题描述】:

我们有一个 SQL Server 2005 数据库,我们希望提高批量删除/插入/选择的性能,我注意到它使用 decimal(18,0) 作为其主键。我知道这会给我们带来比bigint 更多的价值,但我希望这可能是一个快速的胜利,并且根据我的计算应该会持续数百万年的增长。

我在 .net 中看到 docs 小数需要 16 个字节,而不是 long 所需的 8 个字节,但在 SQL Server 中它看起来像 bigint take 8 bytesdecimal(18,0) 只需要 5 bytes - 也可以看到通过select DATALENGTH(max(id)) from table。这是正确的吗?

还有其他原因bigint 可能会变慢还是我应该坚持使用decimal(18,0)

【问题讨论】:

  • 在你的情况下 decimal(18,0) 需要 9 个字节而不是 5
  • DATALENGTH 函数显示 5?

标签: sql sql-server performance sql-server-2005 types


【解决方案1】:

你用 bigint 得到这个范围:

-2^63 to 2^63-1 

also known as roughly:

-9.2 x 10^18 to 9.2 x 10^18

用小数(18,0)得到这个范围

-10^18 to 10^18

十进制:每个精度的存储字节数

Precision    Storage Bytes
1-9:         5
10-19:       9
20-28:       13
29-38:       17

整数类型和存储字节数

integer type    Storage Bytes
bigint          8
int             4
smallint        2
tinyint         1

想法

您的问题中发布的两个示例实际上产生了几乎相同数量的唯一值。

此外,无论您如何选择,您都不会看到显着的性能变化,但如果您开始使用程序员期望整数的小数,您将看到团队中其他程序员的效率发生变化。这是一个小问题。

要解决您的具体问题,如果您想要更大的范围,请使用 Decimal(38,0)。这给了你:

-10^38 to 10^38

如果您担心速度,请使用能在您的软件生命周期内持续使用的最低精度。

如果您不是以纳秒为单位测量时间,那么请选择最适合您的程序员思维方式和您希望拥有一组非常长的数字的选项。

参考文献

【讨论】:

  • 我猜这里的“大致”是一个相对术语,因为bigintdecimal(18,0) 大九倍以上,例如9,223,372,036,854,775,807 / 999,999,999,999,999,999,并且是decimal(19,0) 的92% 以上;但是我猜它比int 更接近bigint 超过四十亿倍......
  • @Gregory 为了便于阅读,“大致”是指舍入到“9.2”
【解决方案2】:

DATALENGTH 在计算字节之前转换为 varchar。所以你的最大值是

这9个字节可以证明。 sys.columns 有一个 max_length 列(十进制是固定长度,所以它总是 9 个字节,在您询问之前)

CREATE TABLE dbo.foo (bar decimal(18,0))
GO
SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('foo') 
GO
DROP TABLE dbo.foo
GO

由于遗留原因,在 SQL Server 2000 添加 bigint 之前,decimal(18, 0) 经常用作“64 位整数”的代理项。

decimal(18, 0)bigint 的范围大致相同:十进制在 9 个字节处多一个字节根据文档

最重要的是,纯整数会比小数更快(可能无法测量)。话虽如此,如果预计明年或 5 年会有超过 40 亿行,那么性能应该很重要。如果没有,那就用int

【讨论】:

  • bigint 适合 64 位机器上的单个寄存器,而 9 字节十进制则不适合。如果我们谈论的是在所有地方都使用的主键,我预计这会非常昂贵。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 2010-12-21
相关资源
最近更新 更多