用于主键的数据类型以及将被清除的数据

时间:2015-01-12 14:47:24

标签: sql-server

我们将记录请求和响应数据并存储到SQL Serve 2008r2。该数据将定期清除:例如每天30天的所有内容都将被删除。

当我们知道数据会定期清除时,我们应该为此模式中的密钥使用什么数据类型?如果我们在清除后没有重新种植,顺序身份将超过2 ^ 31。

我们将根据RequestLog表中的LogActivity Id查询请求/响应数据。

enter image description here

3 个答案:

答案 0 :(得分:1)

只需使用BIGINT即可。你不会用完的。像许多人一样,你大大低估了63位数字的规模。

如果你每秒创造30亿条记录,那么用完大约需要100年才能完成:

100 years * 365.25 days/yr * 24 hrs/day * 60 min/hr * 60 sec/min = 3,155,760,000 seconds.

最大BIGINT是2 ^ 63-1 = 9,223,372,036,854,775,807。

9,223,372,036,854,775,807 / 3,155,760,000 ~= 2,924,712,087 records per second

以该速率生成30天的8字节整数:

8 bytes * 2924712087 per second * 60 seconds/min * 60 min/hour * 24 hours/day * 30 days/month = 60,646,829,836,032,000

或60.6 PB。只是为了那么多8字节键。如果您使用int,它仍然是30 PB。只是为了存储密钥。你是否真的会产生那么多数据?

答案 1 :(得分:0)

我建议使用UNIQUEIDENTIFIER(即GUID)。它们基本上是丢弃值,并且使用NEWID()函数很容易生成:

INSERT INTO [Requests] 
([Id], [Request], [Response], [CreateDateTime]) 
VALUES
(NEWID(), @RequestValue, @ResponseValue, GETDATE())

您还可以提前在代码中生成GUID。这样做的好处是,您可以在将记录插入数据库之前使用ID值(例如,将对象添加到身份映射等)。然后,您可以执行以下插入:

INSERT INTO [Requests] 
([Id], [Request], [Response], [CreateDateTime]) 
VALUES
(@ID, @RequestValue, @ResponseValue, GETDATE())

答案 2 :(得分:-1)

使用CreateDateTime作为PK - 它将永远持续。