- 締切済み
あいまい検索のパフォーマンス向上について
mas_samaの回答
- mas_sama
- ベストアンサー率50% (2/4)
はじめましてt29x0479さん。 DBMSがOracleの場合と考えアドバイスさせていただきます。 ご質問の結論ですが「偶然」ではありません。 経験則のため一概にはいえませんが、Viewを検索する際に 元となるテーブルのインデックスが使用できるケースと 使用できないケースがあります。 また、Oracleであれば実行計画でSQLのコストを測ることで ある程度定量的に評価することが可能です。 →SQLのコストをSQLを実行をして結果が返ってくる速度と 思っていただいても結構です。 →Oracleの実行計画のとり方の参考URL http://biz.rivus.jp/sqlplus/tutorial/autotrace.html DBMSの種類、バージョンが違っていたら 見合った方法を探してみてください。 ご質問のSQLの動作を、拙い知識ではありますが 予測してみましたのでご参考願います。 【前提】 ・View「TABLE1」は名前が紛らわしいため「View1」という名前で再定義します。 ・「View1」は「Table1」と「Table2」の直積と仮定します。 ・「Table1」はカラム「blood_type」があると仮定します。 ・「Table1」を条件「blood_type = 'A'」で絞り込んだ結果を「Table1'」と仮定します。 ・「Table1'」と「Table2」の直積を「View1'」と仮定します。 【もともとのSQL】 「Table1」と「Table2」を直積で得られた「View1」から 次の3つの条件 ・blood_type = 'A' ・name like '%山% ・address like '%中央区%' でレコードを探していると考えられます。 つまり、「Table1」のレコード数×「Table2」のレコード数となる 「View1」から、全レコードを対象に検索していると予測されます。 【パフォーマンスが向上したSQL】 まず、「Table1」を次の条件で絞り込みます。 ・blood_type = 'A' 次に、絞り込んだ結果の「Table1'」と「Table2」を 直積した結果「View1'」から条件 ・name like '%山% ・address like '%中央区%' で絞込みます。 つまり、「Table1'」のレコード数×「Table2」のレコード数となる 「View1'」から、全レコードを対象に検索していると予測されます。 以上より 【もともとのSQL】 「Table1」のレコード数×「Table2」のレコード数 と 【パフォーマンスが向上したSQL】 「Table1'」のレコード数×「Table2」のレコード数 を比較すると 【パフォーマンスが向上したSQL】 のほうが参照するレコード数が少ないため 実行結果が早くなっていると予測できます。 蛇足ですが、「blood_type = 'A'」は血液型でしょうから 日本人が満遍なく登録されているのであれば 全体の4割程度のレコード数でしょうか・・・。 対処方法に関しては是非考えていただきたいのですが 案を1つだけ挙げさせていただけると Viewから参照するのではなく 各テーブル毎に参照してはいかがでしょうか? 最後に余談ですが、プログラムの動作、発生した事象で 偶然と思えたり、考えられたりする場合 事象発生の要因、原因を知らない つまり必然であることが分からないという プログラマーのカンチガイが多いです。
関連するQ&A
- sjisでのあいまい検索を教えてください
Postgres8です。 データベースのエンコーディングは【SQL_ASCII】です。 LIKE検索をした場合のSJISの文字化けに対する対処方法を教えてください あいまい検索をしたいのですが、 文字化け対象文字を含む場合、 どのように記述すればいいのですか? select * from aaa where name = 'パソ\コン'; 上記のように完全一致で検索をすると抽出できます。 select * from aaa where name like '%パソ%' 上記のよう指定してlike検索をしても抽出できます。 しかし以下の場合どちらでも抽出できません。 select * from aaa where name like '%パソコ%' select * from aaa where name like '%パソ\コ%' よろしくお願い致します。
- 締切済み
- PostgreSQL
- ワイルドカードの検索
項目に'%'が入力されているデータを抽出したいのですが、 以下のようなSQLだとデータがすべて抽出されていまいます。 SELECT * FROM t_table WHERE code_name LIKE '%%%' '%'を検索するにはどうのようにすればいいのでしょうか?
- ベストアンサー
- その他(プログラミング・開発)
- 文字検索 (LIKE)を使った場合
テーブル「USERS」の項目「FAMILY_NAME」「FIRST_NAME」をつなげた文字列に対して検索を行ないたいのですが、以下の「LIKE」を使ったSQL分ではカラムがないとエラーになるようです。 方法があれば教えて下さい。 よろしくお願いします。 テーブル:USERS 項目: FAMILY_NAME FIRST_NAME 値: 三木 直人 中川 三郎 SELECT CONCAT(FAMILY_NAME,FIRST_NAME) AS USER_NAME FROM USERS WHERE USER_NAME LIKE '%三%'
- ベストアンサー
- MySQL
- MYSQLで全てのカラムから検索する。
tbというテーブルのbangというカラムに4が含まれていれば表示というのは select * from tb where (bang) like '%4%' ; という形になりますが、このtbテーブルにさらにname,tukiというカラムがあったとして カラムに関係なくレコードのどこかに4が入っていれば抽出するというSQL文が書きたいです。 select * from tb where bang like '%4%' or name like '%4%' or tuki like '%4%' ; と書くことで何とか今まではやってきたのですが、カラム数が増えてきてしまったので、ものすごく長いSQL文なってしまいました。 もう少しスマートにする方法はありませんか?
- ベストアンサー
- MySQL
- PHPからのLIKE検索ができません。
こんばんわ。お世話になります。 PHPからSQLを発行してLIKE検索をしようとしているのですがうまくいきません。(Xampp MySQL) $keyword = htmlspecialchars($_POST['keyword']); mysql_real_escape_string($keyword); $sql = "select * from master where name like '%{$keyword}%'"; テーブル内の name にマッチするはずの言葉があるのにマッチしません。 ちなみに echo $sql; とSQL文を表示させてPhpMyAdminでそれを実行すると、目的の検索結果が表示されます。 いろいろ検索してみたところ、LikeをLike Binary にする方法などがありましたが、どうにもうまくいきませんでした。文字コードはフォーム側、PHP・SQLともにUTF-8です。 '%{$keyword}%'あたりの書き方が悪いのでしょうか。 お手数おかけいたしますがアドバイスの程お願いいたします。
- ベストアンサー
- MySQL
- 複数条件での検索について教えてください
PHPとMySQLで構築するという内容の参考書2冊を読んだ程度の知識レベルです。しばらくPHPと離れていたので、さらに退化しているかもしれません。。。 環境はWindowsXP、PHP4.3.2.2です。 ぜひ、皆さんの知恵をお借りできればと思い、質問をさせていただきます。 DBには 発売日(outday) お菓子名(name) 発売店(shop) などが入っております。 発売日やお菓子名、発売店など1つ~3つの条件で検索することが目的です。 例えば、お菓子名のみの検索をしようとして、 HTMLフォーム <INPUT size="44" type="text" name="name" maxlength="100"> ↑に検索したいお菓子名を記入して、 $sql="select * from okashi where (name like '%$name%') order by outday; ↑でnameのデータを受けとって、欲しいお菓子データを取り出すことはできたのですが、 ↓のように <INPUT size="44" type="text" name="shop" maxlength="100">; <INPUT size="44" type="text" name="name" maxlength="100">; フォームを2つ作り $sql = "select * from okashi where (shop like '$%shop%') and (name like '%$name%')by outday; ↑のように2つ以上の検索条件が重なると、 「0件」みつかりました。と検索が出来なくなってしまいます。 検索条件は、検索項目が1つでも2つでも同じ同一です。 本に書いてあるまま、名前を換えて動かしているつもりなのですが、 どこが間違っているか本当に分かりません。 文字制限で全体を載せることができず、はしょってしまいましたが、 わからない点がありましたらおっしゃってください。 お忙しい中恐れ入りますが、ぜひ皆さんのお知恵をお借りしたいのです。 よろしくお願いします。
- ベストアンサー
- PHP
- Select文のパフォーマンスについて
Select文のパフォーマンスについて質問です。 (1)select * from table1 where col1='00001' and kbn in (1,2,3,4) (2)select * from table1 where col1='00001' and (kbn = 1 or kbn = 2 or kbn = 3 or kbn = 4) (1)と(2)ではどちらがパフォーマンスがよいのでしょうか? SQLServer2008
- ベストアンサー
- SQL Server
- 大文字/小文字の区別しないで検索したい場合
データベース:ORACLE9i いつもお世話になっています♪ いきなり質問ですが、 例えばこういうデータがテーブルに 入っているとします。 ID NAME ----------- 1 AAA1 2 BBB2 3 CCC3 ----------- そこで下記のSQLを実行するとBBB2はヒットしません。 select * from test_tbl where name like '%b%'; 大文字/小文字を区別しないで検索する方法はないでしょうか? よろしくお願いします♪
- ベストアンサー
- Oracle
- インデックスを使用して・・・
おはようございます。 SQLServerのテーブルに格納された情報が多いので インデックスを用いて検索処理を早めたいと考えました。 ---テーブル構成-------------- name / varchar address / varchar age / int ---------------------------- name,addressフィールドにインデックスを指定したのですが、 インデックスを指定することにより検索するSQL文に なにか特別な書き方をしなくてはいけないのでしょうか? select name, address, age from test_table; ってSQLを記述しただけでは、 インデックスを作成する前と後では意味はないのでしょうか? 宜しくお願い致します。m(_ _)m
- 締切済み
- その他(データベース)
お礼
わかりやすい解説、ありがとうございます。 実行計画の取り方を見て勉強します。 また、下記が気になりました。 --- 経験則のため一概にはいえませんが、Viewを検索する際に 元となるテーブルのインデックスが使用できるケースと 使用できないケースがあります。 あいまい検索や、フィールドに関数や演算をかましているケースとか以外に、テーブルを直接みれば、インデックスが有効なのに、Viewなら無効になるケースって、どんなときなのでしょうか?