以下のようなテーブル構成のとき、以下の条件全てに一致する商品IDを検索するにはどうように記述するのが理想でしょうか?
条件:「価格>=10000」「登録日>'2006-07-01'」「タグ='おすすめ'」「商品名='別名1'」
□master:商品マスタテーブル
・id(商品ID)
・price(価格)
・date(登録日)
□tag:タグテーブル
・tag(タグ)
・id(商品ID)
□name:商品名テーブル
・name(商品名)
・id(商品ID)
mater.id = tag.id = name.id となっています。
入力されたデータは以下のようになっています。
■masterテーブル(フィールド id/price/date)
1/10000/2006-08-01
2/15000/2006-08-02
※商品IDはユニーク。
■tagテーブル(フィールド tag/id)
おすすめ/1
定番/1
※1つの商品IDにつき複数のタグを持ちます。
■nameテーブル(フィールド name/id)
品名1/1
別名1/1
※1つの商品IDにつき複数の商品名を持ちます。
ちなみに各テーブルの各レコード数は十数万件あります。
>処理もシンプルに速く動くと思ってよいのでしょうか。
いいえ
データ件数が多い場合、SQLを実行して
実際のQUERY PLANの検証が必要です。
結合の順序をかえたり、条件のしていのしかたにDBの
癖があるので実際にためしてみる必要があります。
Subqueryの方法でもよいと思いますが、
(x) and (y) and (z)
や
(z) and (y) and (x)
等結合の順序や、"()"の指定によっても処理
結果がかわる事があります。
実際に確認して動作速度を調べることをお勧めします。
今回だと商品名='別名1'が制約条件として
一番厳しい(一致件数が少ない)ように思えるが
実際はわからない。
確認方法は、
EXPLAN 確認したいSQL文
http://osb.sra.co.jp/PostgreSQL/Manual/PostgreSQL-7.4-ja/sql...
http://itpro.nikkeibp.co.jp/members/ITPro/oss/20041203/15344...
select m.id from master m, tag t, name n
where m.id = n.id
and m.id = t.id
and m.price >= 10000
and m.date >= '2006-07-01'
and t.tag = 'おすすめ'
and n.name = '別名1'
where句で参照されているカラムにはindexを作成しておいた方がいいと思います。
ありがとうございます。
シンプルな記述ですね。記述がシンプルな方が、処理もシンプルに速く動くと思ってよいのでしょうか。
質問に追加:
サブクエリーの使い方が分からないので、正しく記述できてるか分かりませんが以下のような方法ってどうなのでしょうか。
select m.id from master m where m.price >= 10000 and m.date >= '2006-07-01 and m.id in (select t.id from tag t where t.tag = 'おすすめ' and t.id in (select n.id from name n where n.name = '別名1')
>処理もシンプルに速く動くと思ってよいのでしょうか。
いいえ
データ件数が多い場合、SQLを実行して
実際のQUERY PLANの検証が必要です。
結合の順序をかえたり、条件のしていのしかたにDBの
癖があるので実際にためしてみる必要があります。
Subqueryの方法でもよいと思いますが、
(x) and (y) and (z)
や
(z) and (y) and (x)
等結合の順序や、"()"の指定によっても処理
結果がかわる事があります。
実際に確認して動作速度を調べることをお勧めします。
今回だと商品名='別名1'が制約条件として
一番厳しい(一致件数が少ない)ように思えるが
実際はわからない。
確認方法は、
EXPLAN 確認したいSQL文
http://osb.sra.co.jp/PostgreSQL/Manual/PostgreSQL-7.4-ja/sql...
http://itpro.nikkeibp.co.jp/members/ITPro/oss/20041203/15344...
ありがとうございます。
データベースシステムの種類やバージョン、データベースの組み方やデータの量などはそれぞれなので、実際に試行錯誤しながらそのデータベースにあった最適なものを探すしかないのですね。
URLも参考になりました。
ありがとうございます。
データベースシステムの種類やバージョン、データベースの組み方やデータの量などはそれぞれなので、実際に試行錯誤しながらそのデータベースにあった最適なものを探すしかないのですね。
URLも参考になりました。