我认为您的 RDBMS 在执行查询方面做得很差,其他 RDBMS(例如 SQL Server)可以看到,如果子查询与外部查询不相关,它将在内部实现结果并且不会重复执行子查询。例如
select *
, (select count(*) from tbl) -- an smart RDBMS won't execute this repeatedly
from tbl
一个好的 RDBMS 不会重复执行计数,因为它是一个独立的查询(与外部查询不相关)
尝试所有选项,反正只有少数几个
第一,尝试存在。您的 RDBMS 的 EXISTS可能比它的 IN 快。我遇到的 IN 比 EXISTS 快,例如:为什么最自然的查询(即使用 INNER JOIN(而不是 LEFT JOIN))非常慢 Quassnoi 的相同观察(IN 比 EXISTS 快):http ://explainextended.com /2009/06/16/in-vs-join-vs-exists/
SELECT count(*)
FROM TABLE1
WHERE
-- stringVal IN
EXISTS(
SELECT * -- please, don't bikeshed ;-)
FROM TABLE2
where
table1.stringVal = table2.stringVal -- simulated IN
and table2.idTable2 = 5);
2nd,尝试 INNER JOIN,如果没有重复就使用这个,或者使用 DISTINCT 删除重复。
SELECT count(*)
FROM TABLE1
JOIN (
SELECT DISTINCT stringVal -- remove duplicates
FROM TABLE2
where table2.idTable2 = 5 ) as x
ON X.stringVal = table1.stringVal
第三,尝试自己实现行。我在使用 SQL Server 时遇到了同样的问题,查询物化行比查询另一个查询的结果要快。
检查将查询结果具体化到表的示例,然后在结果上使用 IN。我发现它比在另一种查询方法上使用 IN 更快,您可以阅读帖子的底部:http ://www.ienablemuch.com/2012/05/recursive-cte-is-evil-and-cursor -is.html
例子:
SELECT distinct stringVal -- remove duplicates
into anotherTable
FROM TABLE2
where idTable2 = 5;
SELECT count(*)
FROM TABLE1 where stringVal in (select stringVal from anotherTable);
以上适用于 Sql Server 和 Postgresql,在其他 RDBMS 上可能是这样的:
create table anotherTable as
SELECT distinct stringVal -- remove duplicates
FROM TABLE2
where table2.idTable2 = 5;
select count(*)
from table1 where stringVal in (select stringVal from anotherTable)