使用 char(17) 作为主键在 SQL Server 的表中存储 VIN 号如何影响性能? [关闭]

Posted

技术标签:

【中文标题】使用 char(17) 作为主键在 SQL Server 的表中存储 VIN 号如何影响性能? [关闭]【英文标题】:How does using char(17) as primary key to store VIN numbers in a table with SQL Server affect performance? [closed] 【发布时间】:2015-03-18 13:12:51 【问题描述】:

我正在设计一个带有表格来存储车辆的数据库,由于车辆识别号是一个 17 位字母数字序列号,我的想法是使用它作为主键,数据类型为 char(17)

然后,许多其他表会将 VIN 作为外键。

许多查询/搜索将以 VIN 号作为参数运行,因为这是我们希望跟踪车辆以及与之相关的其他数据的方式。

VIN 号码永远不会改变,但我不确定它是否会导致任何严重的性能下降(或我不知道的其他并发症),因为某些查询将使用连接,而另一些则不使用:/

通过使用 VIN 作为主键,我不必创建唯一约束/附加索引 - 但它必须是 char(17) 一种不同于 int 的数据类型,应该对其进行优化...

我也不能 200% 确定的是,每个 VIN 号码的长度都相同(非常不可能),但在这种情况下,使用varchar(17) 会如何影响整个情况……如果有的话。

谢谢!

【问题讨论】:

主要基于意见 许多好的问题会根据专家经验产生一定程度的意见,但这个问题的答案往往几乎完全基于意见,而不是事实、参考资料或特定专业知识。 大多数情况下,主键首选整数类型,或者如果您希望 VIN 号作为主键,则作为复合主键或将其设为唯一 数据错误怎么办,例如 a) 您将有两辆具有相同 VIN 的车辆 b) 有人需要更改 VIN c) 您有没有 VIN 的车辆?这些属于其他并发症。 @Arvo VIN 号码永远不会改变,并且是独一无二的 @MelanciaUK - 想尝试一下答案吗? 【参考方案1】:

个人意见..

我总是使用 int 作为主键。主键在大多数情况下始终是聚集索引。它是 4 个字节与 17 个字节,您始终可以在 VIN 列上放置一个非聚集索引。保持简单明了。这只是我的意见。

【讨论】:

【参考方案2】:

在我看来,就性能而言,这确实不是一个好主意。不过,这在很大程度上取决于您将在数据库中存储多少辆汽车。另一方面,如果您的应用程序和查询使用 VIN 作为参数,那么它是最佳选择,因为该列已编入索引并且必须是唯一的。

希望对你有帮助

ps:看到其他人对这个话题的建议真是不好意思!

【讨论】:

以上是关于使用 char(17) 作为主键在 SQL Server 的表中存储 VIN 号如何影响性能? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

SQL的约束

sql server 查询约束键在哪个表的脚本

使用主键在 DataView 中定位行

使用复合主键在联结表上设置外键约束

如何使用唯一键而不是主键在 Hibernate 中检索记录

oracle 中查看一张表是不是有主键,主键在哪个字段上的语句怎么查如要查aa表,请写两句分别回答