我只是想知道SQL(特别是SQL Server)的速度有多快。
我可以使用Date类型的可空列,并将其与NULL
进行比较,或者我可以使用不可为空的Date列和单独的bit
列,并比较bit
列到1
/ 0
。
与bit
列的比较会更快吗?
答案 0 :(得分:13)
为了检查列IS NULL
SQL Server实际上只是检查了一下。为每一行存储了一个NULL BITMAP,指示每列是否包含NULL。
答案 1 :(得分:10)
我刚做了一个简单的测试:
DECLARE @d DATETIME
,@b BIT = 0
SELECT 1
WHERE @d IS NULL
SELECT 2
WHERE @b = 0
实际执行计划结果显示计算与批次的成本完全相同。
也许有人可以把它拆开,但对我来说似乎并没有区别。
更多测试
SET DATEFORMAT ymd;
CREATE TABLE #datenulltest
(
dteDate datetime NULL
)
CREATE TABLE #datebittest
(
dteDate datetime NOT NULL,
bitNull bit DEFAULT (1)
)
INSERT INTO #datenulltest ( dteDate )
SELECT CASE WHEN CONVERT(bit, number % 2) = 1 THEN '2010-08-18' ELSE NULL END
FROM master..spt_values
INSERT INTO #datebittest ( dteDate, bitNull )
SELECT '2010-08-18', CASE WHEN CONVERT(bit, number % 2) = 1 THEN 0 ELSE 1 END
FROM master..spt_values
SELECT 1
FROM #datenulltest
WHERE dteDate IS NULL
SELECT 2
FROM #datebittest
WHERE bitNull = CONVERT(bit, 1)
DROP TABLE #datenulltest
DROP TABLE #datebittest
dteDate IS NULL
结果:
bitNull = 1
结果:
好的,所以这次扩展测试再次提出相同的答案 我们可以整天这样做 - 需要一些非常复杂的查询才能找出平均速度更快的查询。
答案 2 :(得分:3)
所有其他条件相同,我会说Bit会更快,因为它是一个“较小”的数据类型。但是,如果性能在这里非常重要(我认为是因为这个问题),那么你应该总是进行测试,因为可能还有其他因素,如索引,缓存会影响这一点。
听起来您正在尝试确定字段的数据类型,该字段将记录事件X是否已发生。所以,要么是时间戳(当X发生时),要么只是一个位(如果X发生则为1,否则为0)。在这种情况下,我很想去找日期,因为它可以为您提供更多信息(不仅是X是否发生,而且也恰好是何时发生),这些信息最有可能在将来用于报告目的。如果较小的性能提升确实更重要,那么只会违背这一点。
答案 3 :(得分:2)
简短回答,如果你只有1和0,比如位图索引1,0就是超快速。 Null没有在某些sqlengines上编入索引,所以'is null'和'not null'都很慢。但是,在实现这一点之前,请考虑实体语义。如果你知道我的意思,最好有一个语义表定义。
速度来自于使用索引的能力,而不是来自数据大小的情况。
修改强>
请参考Martin Smith的回答。对于sqlserver更有意义,我被oracle DB带走了,我的错误在这里。
答案 4 :(得分:1)
这个位会更快,因为加载到内存只会加载1个字节,加载日期将需要8个字节。比较本身将花费相同的时间,但从磁盘加载将花费更多时间。除非您使用非常旧的服务器或需要加载超过10 ^ 8行,否则您将不会注意到任何内容。