sql postgresのEXISTE

2011/06/17

以前、「EXISTS」ってヤツを使うとSQLの実行速度が速くなるとか聞いたので調べてみた。
そのときは時間的・気持ち的に余裕が無かったので放置。
※「EXISTS」ってヤツは「副問い合せ」ってヤツになるならしい。

実行速度を調べる「explain」

とりあえず、実行速度を調べるので「explain」ってヤツを使う。
下記みたいに「select」の前につけるだけでよさげ。

explain select * from xxx

実行すると「cost=xxx」ってのが表示される。
これが目安になるらしい。

結果の「cost=xxx」の値が小さければ速い、大きければ遅い。
※いくつまでが小さいのか、いくつからが大きいのかは知らない。

今回試したのは下記のようなテーブル構成。

テーブル名:tableA
カラム(型):id(serial),title(text)

テーブル名:tableB
カラム(型):id(serial),id_tableA(int),data(text)

今回試してみた結果、思ったのは下記。

「EXISTS」を使った方が実行速度が速い。

データ自体少ないし、クエリも単純だと思うから正直、体感速度に違いは感じかった。
それに一回しかしていないから絶対ではないと思う。
それでも「EXISTS」を使った方が良いんだろうね。

limitありでの実行速度

登録しているデータ量、クエリの内容を考慮せずに見ると「EXISTS」を使わない方が速い。

EXISTSを使わないクエリと実行速度

explain select a.id
from tableA a left join tableB b on a.id=b.id_tableA
where a.title='test'
and b.data is null
limit 1;

実行結果は…
Limit (cost=0.00..9.48 rows=1 width=8)

EXISTSを使ったクエリと実行速度

explain select a.id
from tableA a
where a.title='test'
and EXISTS ( select null from tableB where data is null)
limit 1;

実行結果は…
Limit (cost=702.29..706.75 rows=1 width=8)

limitなしでの実行速度

登録しているデータ量、クエリの内容を考慮せずに見ると「EXISTS」を使った方が速い。

EXISTSを使わないクエリと実行速度

explain select a.id
from tableA a left join tableB b on a.id=b.id_tableA
where a.title='test'
and b.data is null;

実行結果は…
Merge Right Join (cost=1806.54..3571.24 rows=401 width=8)

EXISTSを使ったクエリと実行速度

explain select a.id
from tableA
where a.title='test'
and EXISTS ( select null from tableB where data is null);

実行結果は…
Result (cost=702.29..2491.49 rows=401 width=8)

新着(ニュース関連以外)

2017-08-03
formのinputでmaxlengthを使うとFirefoxでバグってた。他のブラウザでも気づかずにバグってたかもしれない。
2017-07-19
折れ線グラフをもう少しゆるやかに・・・というか何というか・・・調べていくと「移動平均」っていう言葉にたどり着いた
2017-07-10
FuelPHPの1.8をダウンロードして使っていたらセッションが使えないということに気付いた。
2017-06-27
MACにWin10をインストールしてみた:再挑戦。
2017-06-25
「簡単」っていうヤツらが多いけど・・・難しいぞ。