用于具有将被清除的数据的主键的数据类型

Datatype to use for primary key with data that will be purged

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

当我们知道数据将定期清除时,我们应该为该模式中的键使用什么数据类型?如果我们在清除后不重新播种,顺序标识将超过 2^31。

我们将根据 RequestLog table 中的 LogActivity Id 查询 request/response 数据。

我建议使用 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())

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

只需使用一个 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

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

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。只是为了存储密钥。您真的要生成那么多数据吗?