3

1 つのテーブルがはるかに小さい場合、プログラムでテーブルを結合するか、SQL Join ステートメントを使用する方が高速ですか?

より具体的にhashmap<int, string>は、小さいテーブルから文字列を取得し、その値を大きいテーブルから返されたオブジェクトに設定することは、データベース上のテーブルを事前に結合することと比べてどうですか? 2 つのテーブルの相対的なサイズに違いはありますか?

更新:私の質問を言い換えます。大きなテーブルのサブセット(気になる 5,000 から 20,000 レコード) を取得し、小さなテーブル (ローカルにキャッシュする) をプログラムで結合すると、SQL 結合が実行されますか? SQL 結合はテーブル全体に適用されますか、それとも返される大きなテーブルのサブセットのみに適用されますか?

SQL 結合ステートメント:

SELECT id, description
FROM values v, descriptions d
WHERE v.descID=d.descID
AND v.something = thingICareAbout;

個々の声明:

SELECT id, descID
FROM values
WHERE v.something = thingICareAbout;

SELECT descID, description
FROM descriptions d;

プログラムによる参加:

for (value : values){
    value.setDescription(descriptions.get(value.getDescID))
}

追加情報:大きいテーブルには、小さいテーブルの 3,000 の値に対応する合計 800,000,000 レコードがあります。ほとんどの検索では、5,000 ~ 20,000 件の結果が返されます。これはオラクル DB です。

4

4 に答える 4

8

考えないでください。データベースはローカルでできる限り高速に処理でき、すべてのデータをネットワーク経由で送信する必要はありません。

于 2013-01-02T23:19:50.837 に答える
7

一般に、このようなテーブルの結合は、SQL データベースが最適化されている種類の操作であるため、この種の操作に打ち勝つのはかなり難しい可能性があります。

2 つのテーブルの相対的なサイズは、処理中に大きなテーブル データをメモリに保持するために追加のメモリ消費を考慮する必要があるため、結合を「手動で」実行しようとすると違いが生じる可能性があります。

この例は非常に簡単に正しく実行できますが、結合を自分で行うと、結合を実行させた場合にデータベースが提供する組み込みのデータ整合性チェックも失われます。

于 2013-01-02T23:14:44.973 に答える
2

おそらく、SQL の方が作業が速くなります。私の理解では、プログラムでこれを行う場合、データベースから 800,000,000 レコードをアプリケーションのメモリにロードし、次に小さなテーブルの 3,000 レコードをロードしてから、各レコードを照合し、それらのほとんどすべてを破棄する必要があります (あなたの数千の結果しか期待していません)、ユーザーに表示します。

Oracle の右側の列 (両方のテーブルの descID) にインデックスを配置すると、結合レコードを非常に迅速に見つけて、予想される 5,000 ~ 20,000 をロードすることができます。

とはいえ、調べる最も簡単な方法は、両方をテストして数字を取ることです!

于 2013-01-02T23:20:02.777 に答える
1

メモリ内で結合を行う場合、800,000,000 + 3,000 レコードをダウンロードする必要があります。データベースに参加する場合、毎回 5,000 ~ 20,000 件の結果をダウンロードする必要があります。どちらが速く聞こえますか? ヒント: 100,000 回の検索を行う場合は、最初のオプションの方が高速である可能性があります。

于 2013-01-02T23:30:07.350 に答える