「みんな教えて! 選手権!!」開催のお知らせ

1200万件のデータAと1000件のデータBの突き合わせ検索を行おうと考えています。

データの性質上、AのデータがBに含まれているか、という検索を行いたいのですが、単純にAのデータで一件ずつBのデータを検索しようと考えており、そうなると、1200万回のSELECT文を発行することになっていしまいます。

1200万回のデータベースへのアクセスとなると、とてつもない時間がかかりそうなので、なんとか効率よく行いたいと考えているのですが、皆さんだったらどのような方法を考えますか?

私が今考えているのは、1200万件のデータを100個くらいのテーブルに分けて、それぞれで別スレッドを立てて行えれば、単純に100分の1くらいの時間になるのではないかなあ、と考えているのですが・・・

宜しくお願いしますm(_ _)m

A 回答 (6件)

#2です。



パフォーマンスは悪いだろうけど

select Table1.Key, Table1.Data, Table2.Key, Table2.Data
from Table1 inner joib Table2
on Table2.Key like '%' & Table1.Key & '%'

では?
    • good
    • 0
この回答へのお礼

回答、有難うございます。
やはり、結合キーとして、LIKE検索が使えるのですね(゜▽゜)

感覚として、内部結合の方がSELECT文を繰り返す方が速そうな気がしますので、参考にさせて頂きます。

お礼日時:2010/02/26 16:36

Bが1000件程度なのであれば、Bは最初に全件SELECTしてメモリに保持しておき、Aはサーバカーソルで回して、Aのデータ1件毎にBを C# の IndexOf でチェック、というのはどうでしょう。



という処理を CLR ストアド化するとモアベター、かな?

おっしゃるように必要に応じてマルチスレッド化してみても良いかもしれませんね。

いずれにせよ、ある程度試行錯誤は必要でしょう。頑張ってみてください。
    • good
    • 0
この回答へのお礼

回答有難うございます。
仰る通り、何度か試行錯誤をしてみて、一番ベターな方法を試してみようと思っており、その試行錯誤の材料が欲しく、今回質問しました。

メモリに保持&サーバカーソルというのは発想になかったので、参考にさせて頂きたいと思います。

お礼日時:2010/02/26 16:32

内部結合させればいいだけでは?

    • good
    • 0
この回答へのお礼

完全一致ではなく、LIKE検索になるので、JOINはなかなか難しいのかな、もしくはかえって時間がかかってしまうのかな、と思っています。

お礼日時:2010/02/26 16:33

本質的に時間のかかる処理なので、しょうがないかと。

SQLServerはよく知りませんが、Bのデータがキャッシュに載るような工夫をすれば、Aのデータベースを全件読む程度の時間でいけるかと。Bテーブルにたくさんカラムがあってテーブルサイズが大きい場合は、該当カラムとユニークキーだけの小さいテーブルを作る。
    • good
    • 0

土俵は何?


DBなら内部結合するSQL文書けばOK。

select Table1.Key, Table1.Data
from Table1 inner joib Table2
on Table1.Key = Table2.Key

みたいな。
一回投げれば一致行の表が返ります。

この回答への補足

すみません、環境はC#とSQLServerの組み合わせです。

補足日時:2010/02/07 12:08
    • good
    • 0
この回答へのお礼

キーの一致ではなく、あいまい検索なのです。

SELECT *
FROM B
WHERE B.hogehoge LIKE '%A.hoge%'

のイメージです。

お礼日時:2010/02/07 12:05

BのデータでAを検索すれば1000回で済みますけど

この回答への補足

AのデータがBに含まれているかどうかのあいまい検索なので、逆の検索では目的の結果は得られません。

補足日時:2010/02/07 12:06
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報