• 締切済み

SQLについて

こんにちは、honiyonです。  良い質問タイトルが思いつきませんでした...(^^;  2つのテーブルがあります。(仮定です)   ・オーナーの情報テーブル(owner)   ・オーナーの車の情報テーブル(car)  この2つのテーブルを利用して「男性の人で、黒い車に乗ってる人の車種名」を検索しようとしました。  これを1つのSQLで   SELECT car.name FROM owner,car WHERE (owner.no=car.ownerno) and (car.color='black') and (owner.sex='MAN');  とか、   SELECT car.name FROM (SELECT * FROM owner WHERE (owner.sex='MAN')) AS O2, (SELECT * FROM car WHERE (car.color='black')) AS C2 WHERE (owner.no=car.ownerno);  とかやってみましたが、涙が出るほど遅いです。  しかし   SELECT * INTO TABLE owner_tmp FROM (SELECT * FROM owner WHERE owner.sex='MAN'); SELECT * INTO TABLE car_tmp FROM (SELECT * FROM car WHERE car.color='black'); SELECT car_tmp.name FROM (owner_tmp.no=car_tmp.ownerno);  とすると超高速です。  なんとかテンポラリを作らず、出来れば1つのSQL文で高速に冒頭の処理を行いたいのですが、良い方法はないでしょうか。 是非お知恵を貸してください。  宜しくお願いします(.. #データベースはPostgreSQL 7.2.3です。

みんなの回答

noname#4564
noname#4564
回答No.1

  ・レコード件数がどの程度のオーダー(数万件程度か、数100万件以上あるか)か。 ・どの程度のマシンスペック(486なのか、Pen4なのか、物理メモリはなんぼ積んでるのか・・・)か。 ・どの程度の遅さ(3日掛かるのか、30年掛かるのか)か。 といったあたりが何も書かれていないので、どんなコメントを付けたものか迷いますが・・・。 取り合えず、 SELECT   C2.name FROM   (SELECT * FROM owner WHERE (owner.sex='MAN')) AS O2,   (SELECT * FROM car WHERE (car.color='black')) AS C2 WHERE   (O2.no=C2.ownerno); でどうでしょうか。 # 性別と色が文字列で定義されているところに違和感を感じます。 # 性別テーブル、色テーブルを別途定義するのでは、ダメ? (例) [性別テーブル] ID 名称 1 男 2 女 3 ネカマ 4 ネナベ 5 変態 6 スケベおやじ 99 宇宙人 [色テーブル] ID 名称 0x000000 Black 0x0000FF Red 0x00FFFF Yellow 0xFFFFFF White

honiyon
質問者

お礼

こんにちは、honiyonです。  ご回答有難う御座います(..  登録件数はオーナー・車種データにあたるデータは双方共多くても千件程度です。(500個程度かも)  マシンは、K5(クロック忘れました)32MB, P4 2GHz 512MBで試したところ、前者1分程度、後者25秒程度です。  お教え頂いたSQLは明日早速試してみます(^^)  こちらの提示したSQLと微妙な差ですが、これがどう影響するか楽しみです。  因みにこちらの提示した(試した)SQLの記述が少し誤っていたのでこの場を借りて訂正します。 SELECT car.name FROM (SELECT * FROM owner WHERE (owner.sex='MAN')) AS O2, (SELECT * FROM car WHERE (car.color='black')) AS C2 WHERE (O2.no=C2.ownerno); 性別と色は説明を簡略化、分かりやすく為に文字とさせて頂きました。実際は数値になります。実際はちゃんと別途定義を作って指定しています(^^)アドバイス有難う御座います☆ もし不足する情報がありましたらまたご指摘ください。 有難う御座いました。  

honiyon
質問者

補足

こんにちは、honiyonです。  試してみましたが残念ながら高速化は出来ませんでした(/_;)

関連するQ&A