SQL:Bit或char更好(1)

时间:2011-02-24 14:46:07

标签: sql sql-server performance sql-server-2008

检索位或char(1)是否存在性能差异?

只是为了好奇=]

更新:我正在使用SQL Server 2008!

5 个答案:

答案 0 :(得分:18)

对于SQL Server:类型BIT的最多8列可以存储在单个字节中,而CHAR(1)类型的每列将占用一个字节。

另一方面:BIT列可以有两个值(0 = false,1 = true)或根本没有值(NULL) - 而CHAR(1)可以有任何字符值(更多可能性)

实际上,它归结为:

  • 你真的需要一个真/假(是/否)字段吗?如果是这样:使用BIT
  • 你需要的东西不仅仅是两个可能的值 - 使用CHAR(1)

从性能的角度来看,我认为它没有任何显着差异 - 除非你有数万列。当然,使用BIT可以在单个字节中存储多达8列将是有益的。但是,对于你的“普通”数据库案例,你有几个,十几个这样的列,它确实没有太大的区别。选择符合您需求的列类型 - 不要过分担心性能......

答案 1 :(得分:3)

它依赖于实现。一个DBMS可能具有相同的性能,而另一个可能有差异。

答案 2 :(得分:3)

一个位和一个char(1)将占用1个字节进行存储,假设您在表中只有1位列,SQL Server将以1个字节存储tp 8位列。我不认为性能有差异。

有一点需要注意的是,你不能对某个列进行总结

CREATE TABLE #test( a BIT)

INSERT #test VALUES (1)
INSERT #test VALUES (1)

SELECT sum(a) FROM #test

Msg 8117,Level 16,State 1,Line 1
操作数数据类对于sum运算符无效。

你必须先转换它

SELECT sum(CONVERT(INT,a)) FROM #test

答案 3 :(得分:1)

正如亚当所说,这取决于正确实施数据类型的数据库,但理论上如下:

位:

将存储1或0或null。只需要一个位来存储值(根据定义!)。通常用于true或false,许多编程语言会自动将其解释为true或false字段。

字符[1]:

char需要8位或1个字节,因此存储时它的大小为8倍。你可以存储(几乎)任何角色。可能会被编程语言解释为字符串。我认为Char [1]总是会占用整个字节,即使是空的,除非你使用varchar或nvarchar。

答案 4 :(得分:-2)

使用一下。始终使用尽可能小的数据类型。一旦你开始获得大表,它就很重要。