[pgsql-jp: 41402] 複数のテーブルを参照する関数について

高田哲郎 takada @ hngrm.com
2013年 5月 20日 (月) 17:31:52 JST


こんにちは、高田と申します。
関数とそのインデックスについて質問させてください。

以下の様な「商品マスタ」と「ページマスタ」を用意して、各ページで表示可能な商品を抽出することを想定しています。

【m_product】
id|name|user|copy_of
1001|商品A|100|null
1002|商品B|101|1001
1003|商品C|100|null

【m_page】
pageid|user
10|100
11|101
12|102

AからCの商品うち、AとBは同一の商品で登録したユーザが違っており、BはAの「コピー」という位置づけです。
基本的にはコピー以外の全ての商品を抽出しますが、もし自分が登録したコピーが存在する場合はそちらを優先表示する、という意図です。
例)
ユーザA(ID:100)が管理するページ(ID:10)には、商品Aと商品C
ユーザB(ID:101)が管理するページ(ID:11)には、商品Bと商品C
ユーザC(ID:102)が管理するページ(ID:12)には、商品Aと商品C

この内容で商品を抽出する目的で下記のような関数を用意しました。
商品IDとページIDを引数とし、その商品を表示可であれば真、表示不可であれば偽を返します。

select
case
when m_product.user = m_page.user then true
when m_product.user <> m_page.user and m_product.id not in
( select copy_of from m_product s1 where s1.user = m_page.user and
s1.copy_of is not null ) then true
else false
end
from
m_product
left join m_page on m_page.pageid = $2
where m_product.id = $1

より高速に実現できればいいのですが、仮にこの関数を使用するとして、インデクスなどを設定して処理を高速化することは可能でしょうか。
また、可能であればどのように設定すると高速に処理することができるものでしょうか。

ご教示の程よろしくお願い致します。


pgsql-jp メーリングリストの案内