- 締切済み
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です。
- みんなの回答 (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です。 ご回答有難う御座います(.. 登録件数はオーナー・車種データにあたるデータは双方共多くても千件程度です。(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です。 試してみましたが残念ながら高速化は出来ませんでした(/_;)