- - PR -
アドレス検索の方法と高速化について
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-12-05 15:11
いつもここで勉強させていただいております。
現在以下の問題で悩んでおります。 -------------------------------------------------------------------------------- 【住所テーブル】(本番環境のDATA件数:数千万件) @コード A場所1(〜県) B場所2(〜市) C場所3(〜区) D建物1(丁) E建物2(番) F建物3(号) GAサービスステータス HBサービスステータス ICサービスステータス 【条件】 条件1:住所テーブルの@〜Fに対して,全てAND条件で検索し,該当データが存在しない場合条件2へ 条件2:住所テーブルの@〜Eに対して,全てAND条件で検索し,該当データが存在しない場合条件3へ 条件3:住所テーブルの@〜Dに対して,全てAND条件で検索し,該当データが存在しない場合条件4へ 条件4:住所テーブルの@〜Cに対して,全てAND条件で検索し,該当データが存在しない場合条件5へ 条件5:住所テーブルの@〜Bに対して,全てAND条件で検索し,該当データが存在しない場合未登録とする 【ステータス】 該当データ1件の場合は,当該データのステータスを適用する。 該当データが複数件の場合,各サービスでステータスが最も良いものを適用する。 -------------------------------------------------------------------------------- 条件1〜5のSQLを合計5回実行後,取得データの適用ステータスを検出する方法にて コーディングは可能ですが,本番環境のデータ件数が数千万件あるため, 可能な限りレスポンスを速くしたいと思っております。 SQL実行回数を減らすなどして改善は可能でしょうか。 ご教授お願い致します。 Tomcat5.0 j2sdk1.4.2_10 [ メッセージ編集済み 編集者: ひろ 編集日時 2006-12-05 15:16 ] | ||||||||
|
投稿日時: 2006-12-05 16:04
可能。 「条件3:住所テーブルの@〜Dに対して,全てAND条件で検索し,該当データが存在しない場合条件4へ。データがある場合条件2へ。以下略」とするだけで、最悪の場合5回行っていたのが、3回になるよね。もちろん最良で2回実行するのだけど・・・。 検索結果をテンポラリテーブルに格納するようにして、「条件5→条件4→条件3・・・」の順番で検索。条件4以降は検索対象のレコード数が減るので、処理も高速になるはず・・・。 どうするのが良いのかは、実際のデータがどうなっているかが重要。住所が広い地域に分散しているのか、あるいは特定地域に集中しているのかでも、最良の方法は違ってくる。 | ||||||||
|
投稿日時: 2006-12-05 16:20
ご返信ありがとうございます。 >「条件3:住所テーブルの@〜Dに対して,全てAND条件で検索し, >該当データが存在しない場合条件4へ。データがある場合条件2へ。以下略」 条件3→4→2の順でSQLを3回実行するということでしょうか。 >検索結果をテンポラリテーブルに格納するようにして、 >「条件5→条件4→条件3・・・」の順番で検索。 はい。現在条件5のSQLのみ1回実行して,取得データを検索し, SQLを5回実行した場合と同様の結果が得られないか検討・コーディングしております。 | ||||||||
|
投稿日時: 2006-12-05 16:33
条件3→4→2って・・ 条件3の結果によって3→2→1もしくは3→4→5の2通りだと読みましたが。 (蛇足) 2分探索を知っていれば応用できていいと思うんですが・・ [ メッセージ編集済み 編集者: shimix 編集日時 2006-12-05 16:35 ] | ||||||||
|
投稿日時: 2006-12-05 16:34
decode関数を使ってorder byして、1件目にヒットするデータを使うようにすれば、SQL1回でもできると思いますよ。
ただし、これでパフォーマンスが良くなるかは別問題で、どの方法がよいかは実際に測って確かめてみてください。 # decode関数ってOracleだけでしたっけ?代用になるものはあるとおもうけど。 | ||||||||
|
投稿日時: 2006-12-05 17:09
失礼しました。ご指摘ありがとうございます。 | ||||||||
|
投稿日時: 2006-12-05 17:14
ご返信ありがとうございます。 HITしたデータ郡の中から各サービスでステータスの最も良いものを抽出しなければなりません。 余談ですが,SELECT区にdecode関数を用いることにより一度の検索で, 取得データを元に,あとはjavaプログラムで処理するという方法が可能かも知れません。 |
1