我们的数据库是SQL Server 2008.出于某种原因,DBA(现在已经不见了)制作了我们所有的主键DECIMAL(38,0)
。这些列未指定为标识列 - 相反,应用程序代码中有一个公式为列生成唯一标识符(随机数)。
我们显然不会在短时间内将38位数字作为我们数据的主键。实际上,这个概念很好。该数字应该是统计随机的(如果不是更随机),而不是uniqueidentifer
类型,我们只是没有应用程序代码生成数字的便利。
我的问题是:如果我要将这些DECIMAL(38,0)
列转换为VARCHAR(38)
,那么索引大小,索引速度,数据检索速度,存储要求等方面是否有任何优势......?我们不需要对这些列进行任何数学运算,因此将它们设为DECIMAL(38,0)
似乎是一种浪费。
我更像是一名应用程序开发人员,而不是DBA,所以请原谅我,如果这听起来像一个无知的问题。
答案 0 :(得分:1)
简答:不。
您不太可能看到任何存储改进。 decimal(38,0)
每个需要17个字节。 varchar(38)
最多可占用40个字节(实际数据长度为+ 2 bytes overhead)。性能更难衡量,但现代CPU上的FPGA用于计算浮点数,因此我自然希望decimal
有很大的提升。
最后一件事:
该数字应该与
一样具有统计随机性(如果不是更随机)uniqueidentifer
类型
大多数随机数生成器都是伪随机数。他们没事,但不是很好。如果您的应用程序因随机数的质量而死或死,请尝试使用加密级随机数生成器。