2つのうちどちらがパフォーマンスが良いか(最近、Oracleで使用したため、コードに注意しないと非難されました):
Select *
from Tab1
Where (not) exists(Select 1 From Tab2 Where Tab1.id = Tab2.id)
Select *
from Tab1
Where (not) exists(Select Field1 From Tab2 Where Tab1.id = Tab2.id)
それとも両方同じですか?
SQL Serverの観点とOracleの観点の両方から回答してください。
私はググりました(主にsql-server側から)と私は今でも多くの議論があることを発見しましたが、私の現在の意見/仮定は両方のRDMBSのオプティマイザは十分に成熟しているため、サブクエリから必要なものはすべてブール値。
はい、同じです。 exists
は、サブクエリに少なくとも1つの行があるかどうかを確認します。その場合、true
と評価されます。サブクエリの列はどのような意味でもありません。
[〜#〜] msdn [〜#〜] によると、exists
:
行の存在をテストするサブクエリを指定します。
そして Oracle :
EXISTS条件は、サブクエリに行が存在するかどうかをテストします。
多分 MySQLドキュメント はさらに説明します:
伝統的に、EXISTSサブクエリはSELECT *で始まりますが、SELECT 5またはSELECT column1などで始まる場合もあります。 MySQLはそのようなサブクエリのSELECTリストを無視するため、違いはありません。
これは古いことはわかっていますが、最近観察した点をいくつか追加したいと思います。
存在のみのチェックが存在しますが、「select *」allを書き込むと、列は拡張されます。このわずかなオーバーヘッド以外は、違いはありません。
ソース:
http://www.sqlskills.com/blogs/conor/exists-subqueries-select-1-vs-select/
更新:
私が参照した記事は無効のようです。ただし、[select 1
と書いても、SQLServerはすべての列を展開します。
さまざまなアプローチを使用する場合の詳細な分析とパフォーマンス統計については、以下のリンクを参照してください。
Exists 1またはExists * を使用したサブクエリ