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)
カラム(型):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;
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;
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;
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);
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)