我非常清楚,如果我使用nvarchar
字段作为主键或外键,那么在大多数情况下(如果不是全部),这将增加一些时间和空间开销。
一般来说,使用数字键是个好主意,但在某些常见情况下(例如,小数据集),使用基于文本的键并不是一个问题。
但是,我想知道是否有人能够提供严格的信息,说明在某些情况下,使用文本作为数据库键而不是数字值是否更有效,或者至少是相等的。
考虑一种情况,其中一个表包含一个简短的记录列表。对于我们的例子,我们会说我们需要50条记录。每个记录都需要一个ID。您可以使用通用的int
(甚至smallint
)数字(例如[1...50]
)或为char(2)
字段(例如[AL, AK, AZ, AR, ... WI]
)分配有意义的2个字符值。
在上述情况下,我们可以假设使用char(2)
字段可能比使用int
键更有效,因为char数据是2字节,而与int一起使用的是4字节。理论上,使用smallint
字段的效率与char(2)
字段以及可能的varchar(2)
字段一样有效。
使用基于文本的键而不是数字键的好处是,这些值是可读的,这将使许多人清楚地看到,我列出的50项记录很可能是一份美国国家的清单,
如前所述,使用可比数字键大小较小或相等的键应具有类似的效率。但是,取决于数据库引擎的体系结构和设计,在实际使用中可能会产生意想不到的结果。
有了这些说明,使用任何形式的基于文本的值作为Server中的键是更多、更平等还是更低效率?
我不需要过分深入的研究结果(尽管我不介意),但我正在寻找一个答案,它超越了我们对数据库的期望。
明确地说,随着文本键大小的增加/减少,基于文本的键的效率如何与基于数字的键相比?
发布于 2016-03-22 06:02:16
在大多数情况下,由业务需求(用例)驱动的考虑因素将远远超过数字与文本键之间的任何性能差异。除非您考虑的是非常大的和/或非常高的吞吐量系统,否则主键类型的选择应该基于密钥的使用方式,而不是数字键和文本键在性能上的微小差异。
发布于 2016-03-22 05:18:43
在集会中思考,找出答案。你说过:
我们可以假设使用char(2)字段可能比使用int键更有效,因为char数据是2字节,而与int一起使用的是4字节。从理论上讲,使用smallint域与char(2)域以及可能的varchar(2)域一样有效。
这不是真的,因为你不能在一条指令中同时移动两个字符(据我所知)。因此,即使一个char
比一个4字节的int
小,你也必须一个一个地将它们移动到寄存器中来进行比较。要比较4字节int
的两个实例,即使它的大小更大,每个int
只需要1次移动指令(不需要将它们从寄存器中移回内存)。
那么如果您使用int
会发生什么呢?
然而,在char
的情况下:
int
的相同。
要点是,在低级别上,决定因素不是数据大小,而是所需指令的数量。
除了低级的东西:
int
,那么您的记录将与实际发生的情况无关,在这种情况下,您只需更新缩写和状态名称本身,您就可以放心地确保一切都是一致的。https://stackoverflow.com/questions/36155013
复制