为什么<columnname> IS NULL需要这么长时间?</columnname>

时间:2013-05-15 16:42:21

标签: performance sql-server-2008

我有一个测试语句来检查我的数据验证,如下所示:

SELECT id, owner_id 
FROM table 
WHERE ISNULL(owner_id,0)=0
   OR (owner_id NOT IN(SELECT lid FROM actors) AND owner_id <> -65536)

OR

SELECT id, owner_id 
FROM table 
WHERE owner_id IS NULL
   OR (owner_id NOT IN(SELECT lid FROM actors) AND owner_id <> -65536)

在我的测试用例中,两个语句都需要1分45秒才能完成。

owner_id应该是有效的int&gt; 0,所以如果我的数据无效,我的SQL语句应该检查它。

该声明按预期工作,但需要很长时间。 我在第一次尝试后在该列上添加了一个sql索引,看看是否有任何改进。没有变化。

如果我这样做:

SELECT id, owner_id 
FROM table 
WHERE (owner_id NOT IN(SELECT lid FROM actors) AND owner_id <> -65536)

然后查询执行时间不到1秒。

table有大约7k条记录,actors大约有5k条记录。

所以任何人都知道为什么IS NULL?验证花了这么长时间?我可以对此做任何改进吗?

修改

SELECT id, owner_id 
FROM table 
WHERE ISNULL(owner_id,0)=0

也会在1秒内执行,因此它是需要这么长时间的声明的组合。 所以它不是ISNULL验证,而是我在WHERE语句中的组合。

已更新

尝试@mbeckish建议

SELECT lid, lownerid 
FROM xapptqadr 
WHERE ISNULL(lownerid,0)=0

UNION

SELECT lid, lownerid 
FROM xapptqadr 
WHERE (lownerid NOT IN(SELECT lid FROM kractor) AND lownerid <> -65536)

将在不到1秒的时间内完成预期。 但OR部分产生如此大的差异......我真的不知所措......

1 个答案:

答案 0 :(得分:4)

这不是空检查。这是OR。在查询中查找或者查询通常会破坏良好的索引使用率,从而导致查询性能不佳。以下不能得到相同的结果吗?

SELECT id, owner_id 
FROM table 
WHERE owner_id NOT IN(SELECT lid FROM actors WHERE lid IS NOT NULL) AND owner_id <> -65536
相关问题