2

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

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)

或者

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> 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部分产生如此大的不同的事实所震撼......

4

1 回答 1

4

这不是空检查。这是OR. 在查询中查找此 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
于 2013-05-15T16:50:14.737 回答