web-dev-qa-db-ja.com

存在する/存在しない: 'select 1' vs 'select field'

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のオプティマイザは十分に成熟しているため、サブクエリから必要なものはすべてブール値。

17
anonxen

はい、同じです。 existsは、サブクエリに少なくとも1つの行があるかどうかを確認します。その場合、trueと評価されます。サブクエリの列はどのような意味でもありません。

[〜#〜] msdn [〜#〜] によると、exists

行の存在をテストするサブクエリを指定します。

そして Oracle

EXISTS条件は、サブクエリに行が存在するかどうかをテストします。

多分 MySQLドキュメント はさらに説明します:

伝統的に、EXISTSサブクエリはSELECT *で始まりますが、SELECT 5またはSELECT column1などで始まる場合もあります。 MySQLはそのようなサブクエリのSELECTリストを無視するため、違いはありません。

18
Patrick Hofman

これは古いことはわかっていますが、最近観察した点をいくつか追加したいと思います。

存在のみのチェックが存在しますが、「select *」allを書き込むと、列は拡張されます。このわずかなオーバーヘッド以外は、違いはありません。

ソース:
http://www.sqlskills.com/blogs/conor/exists-subqueries-select-1-vs-select/

更新:
私が参照した記事は無効のようです。ただし、[select 1と書いても、SQLServerはすべての列を展開します。

さまざまなアプローチを使用する場合の詳細な分析とパフォーマンス統計については、以下のリンクを参照してください。

Exists 1またはExists * を使用したサブクエリ

5
TheGameiswar