SQL 服务器 DATE 与 INT 作为主键
SQL Server DATE vs INT as primary key
我有一个参考资料 table,它将在很长一段时间内跟踪给定的日期范围,最精细的级别是给定的一天。
几位同事建议我使用代理 INT 作为密钥,格式为 YYYYMMDD。虽然这似乎是合乎逻辑的过程,但我想知道使用简单的 DATE 数据类型作为 PK 而不是 INT。我的理由有两个:
- DATE 取代了 3 个字节的数据,而 INT 取代了 4 个。虽然就 space 而言这并不能节省很多,但它可以在性能方面节省很多。考虑到这个table也会有覆盖非聚集索引,主键的大小也很重要(隐藏索引列)。
- 由于使用此数据的上下文确实围绕日期展开,因此我担心 INT 和 DATE 之间的转换。在小范围内,差别不大;然而,一旦我们扩大规模,它可能会很明显。
因为我在做数据仓库,所以我会选择代理键,并在您的其他 table 中引用该键。基于整数的联接仍然比基于日期数据类型的联接更快
创建一个用日期填充的 table,类似这样...并在其他 table 中使用该日期键。
+---------+-----------+-----+------+----+
|DateKey |Date |Year |Month |Day |
+---------+-----------+-----+------+----+
|20170320 |20-03-2017 |2017 |3 |20 |
|20170321 |21-03-2017 |2017 |3 |20 |
|20170322 |22-03-2017 |2017 |3 |20 |
+---------+-----------+-----+------+----+
我有一个参考资料 table,它将在很长一段时间内跟踪给定的日期范围,最精细的级别是给定的一天。
几位同事建议我使用代理 INT 作为密钥,格式为 YYYYMMDD。虽然这似乎是合乎逻辑的过程,但我想知道使用简单的 DATE 数据类型作为 PK 而不是 INT。我的理由有两个:
- DATE 取代了 3 个字节的数据,而 INT 取代了 4 个。虽然就 space 而言这并不能节省很多,但它可以在性能方面节省很多。考虑到这个table也会有覆盖非聚集索引,主键的大小也很重要(隐藏索引列)。
- 由于使用此数据的上下文确实围绕日期展开,因此我担心 INT 和 DATE 之间的转换。在小范围内,差别不大;然而,一旦我们扩大规模,它可能会很明显。
因为我在做数据仓库,所以我会选择代理键,并在您的其他 table 中引用该键。基于整数的联接仍然比基于日期数据类型的联接更快
创建一个用日期填充的 table,类似这样...并在其他 table 中使用该日期键。
+---------+-----------+-----+------+----+
|DateKey |Date |Year |Month |Day |
+---------+-----------+-----+------+----+
|20170320 |20-03-2017 |2017 |3 |20 |
|20170321 |21-03-2017 |2017 |3 |20 |
|20170322 |22-03-2017 |2017 |3 |20 |
+---------+-----------+-----+------+----+