2009-09-02 101 views
0

在索引/查询等方面,其中一个的性能优于另一个吗?数据库字段的比较/性能为int vs char(1)

例如声明列 活跃CHAR(1)以 'Y'/ 'N' 值 VS 与价值观IS_ACTIVE TINYINT 1/0

有传言说人们似乎更喜欢使用CHAR(1) ,而大多数地方我倾向于宣布他们为tinyint/int不是最少的,因为它易于使用/类型

任何真正的性能比较呢? 我记得像甲骨文二进制值索引(位图索引或一些这样的) - 有什么类似的sql2005/sql2008/...?

更新 - 在回应一些下面的意见,性能会在索引查询/更新定义的,存储是无关紧要的考虑是够便宜

语义太不相关!

回答

3

与CHAR/VARCHAR。任何一列有送你通过所有的信件翻译/整理等索引期间,平等测试的语义额外的内部代码的潜力等

因此,一些更好。并且是您描述的情况的最佳解决方案 - 它只存储0或1(当然可以为空)。

SQL服务器确实崩溃位字段内部最多可存储在每个字节8个字段,所以如果你有多个位字段,它比TINYINT更高效:

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

+0

位域无法被索引......因此无法用于查询....因此tinyint/smallint/int/bigint列也会出现语义问题! – Kumar 2009-09-02 20:18:56

+0

你*可以*索引位字段,它只是没有什么好处,因为只有两个值!如果您将两个值存储在其他某种列中并对其进行索引,那么该索引执行的效果会很差。 – richardtallent 2009-09-03 08:12:57

+0

更多信息: http:// stackoverflow。com/questions/231125/should-i-index-a-bit-field-in-sql-server – richardtallent 2009-09-03 08:13:33

1

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

0

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

if is_active = 'Y' then 

...不是...

if is_active = 1 then 

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

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

+0

不是一个瓶颈,因为该系统尚未实现...但是,这是一个实时风险mgmt应用程序每毫秒的提升将是很好的 – Kumar 2009-09-02 20:21:19