我有一个测试语句来检查我的数据验证,如下所示:
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
部分产生如此大的差异......我真的不知所措......
答案 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