あなたのRDBMSはあなたのクエリをうまく実行していないと思います.他のRDBMS(SQL Serverなど)は、サブクエリが外部クエリと相関していない場合、内部的に結果を具体化し、サブクエリを繰り返し実行しないことを確認できます. 例えば
select *
, (select count(*) from tbl) -- an smart RDBMS won't execute this repeatedly
from tbl
独立したクエリであるため(外部のクエリとは相関していない)、優れたRDBMSはカウントを繰り返し実行しません。
すべてのオプションを試してみてください。
まず、EXISTS を試してください。RDBMS の EXISTSは、IN よりも高速である可能性があります。ただし、IN は EXISTS よりも高速であることに遭遇しました。例:最も自然なクエリ (つまり、(LEFT JOIN の代わりに INNER 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);
2番目に、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
3番目に、自分で行を具体化してみてください。SQL Server で同じ問題が発生しました。具体化された行のクエリは、別のクエリの結果をクエリするよりも高速です。
クエリ結果をテーブルにマテリアライズし、結果に IN を使用する例を確認してください。別のクエリ アプローチで IN を使用するよりも高速であることがわかります。投稿の下部を読むだけで済みます。 -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)