数据库字段的比较/性能为int vs char(1)

时间:2009-09-02 19:52:45

标签: c# .net sql-server performance optimization

在索引/查询等方面,哪一个表现优于另一个?

e.g。将列声明为 具有'Y'/'N'值的有效Char(1) VS is_active tinyint,值为1/0

有趣地说,大多数地方似乎人们更喜欢使用char(1) 我倾向于将它们声明为tinyint / int,因为它易于使用/类型

那里有真正的性能比较吗? 我记得像oracle中的二进制值索引(位图索引或类似的东西) - sql2005 / sql2008 /...?

中有类似的东西吗?

更新 - 响应下面的一些评论,性能将根据索引查询/更新来定义,考虑到它的价格足够便宜,存储无关紧要

语义也不相关!

3 个答案:

答案 0 :(得分:3)

任何具有char / varchar的列都有可能在索引,等式测试等过程中向您发送所有额外的内部代码,用于字母翻译/校对等语义。

所以,一个数字更好。并且是您描述的案例的最佳解决方案 - 它只存储0或1(当然可以为空)。

SQL Server 在内部折叠位字段以在每个字节中存储多达8位字段,因此如果您有多个位字段,它比tinyint更有效:

http://msdn.microsoft.com/en-us/library/ms177603.aspx

答案 1 :(得分:1)

Oracle中没有整数或逻辑数据类型。位图索引与从其他数据类型的列值派生的不同。

答案 2 :(得分:0)

如果所有RDBMS产品都支持布尔数据类型,那就太好了。然后我们可以杀掉这个问题。事实上,它归结为个人品味。我发现它更容易理解......

if is_active = 'Y' then

......而不是......

if is_active = 1 then

但如果我说法语而不是英语,我会希望它是O / N,而1/0实现是通用的。关键是在整个系统中使用单一约定。

关于性能,如果你的最大瓶颈是char(1)和整数之间的差异,那么我向你的调优能力致敬。