0

今日、以前のスレッドがクエリを解決できるようになる前に、クエリを解決するために質問する必要があるのはこれが初めてです。

シナリオ: データベースに 2 つのテーブル (A と B としましょう) があり、いくつかの同じ行といくつかの異なる行があります。注目すべき点は、両方のテーブルに数百万、または少なくとも 100 万を超える行があることです。

ここで、いいえのようにそれらに対して設定操作を実行する必要があります。同じ行の (交差) 、いいえ。新しい行(AB)の数といいえ。古い行 (BA) の。

2 つの選択肢があります。1) データベースに対してクエリ自体としてセット操作を実行できます。

2) または、レコードをフェッチして、メモリ内の java.util.ArrayLIst で操作を実行できます。

しかし、どちらの場合も、5〜10分ほど時間がかかりすぎて、これに最適な(最適化された)アプローチになる可能性があります

助けてください。

4

3 に答える 3

1

まずunionminus、 などはテーブルに対する操作ではなく、selectステートメントの結果に対する操作です。あなたの場合、巨大なテーブルをスキャンし、巨大な結果セットを作成してから、それぞれの結果を比較します。これは非常に遅いです。インデックスを使用できるように最適化する必要があります。

第二に、DB から Java に結果をロードしてからそれらを処理することは、DB で処理して Java で結果を準備するよりも本質的に遅くなります。

于 2011-07-11T05:04:45.760 に答える
0

RDBMS のクエリ ロジックの最適化には何百年もの工数が費やされたため、データベース アプローチを採用してください。この作業をクライアントで再現したくないと確信しています。現在 SQL の使用が遅すぎる場合は、必要なすべてのインデックスが適切に配置されていることを確認し、クエリの実行計画の分析を実行して (その方法はデータベース管理システムによって異なります)、クエリのボトルネック (完全なテーブルなど) を見つけます。スキャン)。

于 2011-07-11T04:59:42.510 に答える
0

データベースに任せます。

テーブルに主キーがまだない場合は、両方のテーブルに列値のハッシュを格納する (インデックス付きの) 列を作成し、その列を使用して簡単に比較できます。たとえば、次のようになります。

SELECT COUNT(*)
FROM a JOIN b ON a.hash = b.hash
    AND a.ColA = b.ColA
    AND a.ColB = b.ColB
于 2011-07-11T04:59:59.560 に答える