SQLのON句に抽出条件も書く
ベテランエンジニアでも知らないSQLの事
「SQLのON句に抽出条件も書く」
結合の前に、結合対象の二つのテーブルを小さくすることが目的。
たとえば、WHERE句では絞り込むための抽出条件を記載するが、これと同様の条件をON句に書くと、
結合処理が軽くなり、クエリーのパフォーマンスよくなることがある。
JOINの条件を指定することで、プランナを制御して実行計画を変更するということ。
昨日、はじめてこれを意識してSQLを書いた。
150億レコードのGAログテーブルのJOINで効果を実感した。
ウェブログに売上(コンバージョン)情報を紐付けるクエリ
変更前と変更後のSQLイメージ
code:before.sql
select
g.evnet_date --
sum(case when g.event_type = 'PAGE' then 1 end) as pv
,p.uid -- ユーザーID
,sum(p.purchase_price) as purchase_price
from
ga_log as g
left join
purchase_log as p
-- 結合条件
on g.transaction_id = p.transaction_id
where
g.event_date = '2019-06-04'
group by
g.evnet_date
,p.uid
code:after.sql
select
g.evnet_date
sum(case when g.event_type = 'PAGE' then 1 end) as pv
,p.uid -- ユーザーID
,sum(p.purchase_price) as purchase_price
from
ga_log as g
left join
purchase_log as p
-- 抽出条件
on g.event_date = '2019-06-04'
and trunc(p.order_datetime) = '2019-06-04'
-- 結合条件
and g.transaction_id = p.transaction_id
where
g.event_date = '2019-06-04'
group by
g.evnet_date
,p.uid