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)

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

2018-07-26
年賀状で「新春」とか書くけど・・・何故なんだろうと8月を目前にした今、疑問に思った。
2018-05-16
PHPで画像のヘッダ情報(?)の「Orientation」を元に画像回転させたい。
2018-03-05
Android Studioをインストール。エミュレータを軽くするトコまで終わらせたかったけど、挫折した。
2018-02-23
プッシュ通知について調べてた時にでてきたServiceWorker。そのServiceWorkerについてのメモ。
2017-12-13
jqueryで取得したDOM要素をオブジェクトじゃなくて、配列で受け取りたい