检查Date是否(非)为NULL或将某位与1/0进行比较是否更快?

时间:2010-08-18 08:02:23

标签: sql sql-server performance

我只是想知道SQL(特别是SQL Server)的速度有多快。

我可以使用Date类型的可空列,并将其与NULL进行比较,或者我可以使用不可为空的Date列和单独的bit列,并比较bit列到1 / 0

bit列的比较会更快吗?

5 个答案:

答案 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

实际执行计划结果显示计算与批次的成本完全相同。

Actual Execution Plan

也许有人可以把它拆开,但对我来说似乎并没有区别。


更多测试

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

Actual Execution Plan

dteDate IS NULL结果:

IS NULL tooltip

bitNull = 1结果:

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行,否则您将不会注意到任何内容。