我有一个测试语句来检查我的数据的验证,如下所示:
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
部分产生如此大的不同的事实所震撼......