0

10 億のレコードを持つテーブル X があるとします。

Table X

ProductID AccountID ContractID

ProductIDそしてAccountID、テーブル X の複合キーを作成します。

今、メモリには、100 万の (ProductID, AccountID) ペアを含むマップ (Java HashMap としましょう) があります。

すべての (ProductID、AccountID) と、そのペアに対応する ContractID を含むファイルを作成したいと考えています。

これで、for ループを使用して、(ProductID、AccountID) ごとにテーブルをクエリできますが、これを何百万回も実行する必要があり、非常に非効率的です。

問題は、これを効率的に行うクエリをどのように作成するかです。または、そのようなクエリをまったく作成できますか? 別の方法はありますか?

4

3 に答える 3

2

速度と効率が重要な場合、IN 句に 100 万の「ユニオン」または 100 万のアイテムを含むクエリは受け入れられません。

より効率的な解決策は、ProductID/AccountID ハッシュマップを一時テーブルに一括挿入することです。これを #temp と呼びましょう。データベースに依存するため、一括挿入については説明しません。次に、単純な結合クエリを実行できます。

SELECT ProductID, AccountID, ContractID
FROM X
INNER JOIN #temp t ON t.ProductID = X.ProductID AND t.AccountID = X.AccountID
于 2013-06-12T15:29:13.630 に答える
1

正確な SQL 方言を知らなくても、次のことを実行しますINNER JOIN

SELECT ProductID, AccountID, ContractID
FROM X
INNER JOIN MemTable m ON m.ProductID = X.ProductID AND m.AccountID = X.AccountID

タグとして追加さJavaれましたが、マップは Java アプリケーション内にあると考えてよろしいですか? もしそうなら、それは難しくなります - 実際には、データベースに何百万回も問い合わせる必要があるかもしれません.

一方、次のような 1 つの大きな SQL ステートメントを含む文字列を作成することもできます。

SELECT * FROM X WHERE ProductID IN (...) AND AccountID IN (...)

ループは、製品 ID とアカウント ID のリストをコンマで区切って入力するだけです。次に、そのコマンドを 1 回発行します。両方の ID が数値であると仮定すると、コマンドはたとえば次のようになります。

SELECT * FROM X WHERE ProductID IN (1,2,3,4) AND AccountID IN (99,88,77)

編集
私の最後の提案には次の欠陥がある可能性があることに注意してください(これが実際に問題であるかどうかを判断する必要があります):

マップに (1, 99) と (3, 77) が含まれていると仮定しますが、テーブルXには追加のレコード (1, 77) と (3, 99) があります。私のクエリの結果は、(1,99)、(3, 77)、(1, 77)、および (3, 99) になります。これは、両方の ID が「エンティティ」としてではなく個別に扱われるためです。

そのため、指定された ProductID と AccountID の任意の組み合わせを含む行がある限り、それらが返されます。

SELECT使用しているDBシステムでこれが許可されていると仮定すると、ステートメントを次のように展開できます。

SELECT ProductID, AccountID, ContractID FROM X WHERE ProductID = <ValueFromMap> AND AccountID = <ValueFromMap>
UNION ALL
SELECT ProductID, AccountID, ContractID FROM X WHERE ...
UNION ALL
...
于 2013-06-12T15:01:31.220 に答える
0

あなたのメモリマップはJavaプログラムにあると思いますか? もしそうなら、データベースに依存しない効率的な解決策はないと思います。私が考えることができる最善の方法は、メモリマップで連続した ID 範囲を見つけて、SELECT FROM X where ID >= xx AND id <= yy を記述し、重複する ID を選択しないようにすることです。

于 2013-06-12T15:07:15.553 に答える