0

継続

select a.artno, a.name 
from Art a 
inner join store s on a.Artno <> s.Artno` 

このクエリを実行すると、7.9Kの結果が得られるはずでしたが、1分以上かけて899Kの行が生成されました。

select artno 
from art 
except 
(select artno from store)

このコード行は、私に当てはまる7.9K行を提供します。

最初のコードは機能しているように見えますが、時間がかかり、大きな結果セットが生成されます。なぜだろうか?

4

2 に答える 2

2

多くのレコードが必要であることが本当にわかっている場合を除いて、通常<>、INNERJOINで演算子を使用することはお勧めできません。言い換えれば、JOINは、除外ではなく、含めるための優れたツールです。

演算子(特にキーに対して)を使用して内部結合を実行する<>と、クエリは、キーが一致する場所を除いて、artstoreレコードのすべての組み合わせを返します。Artno

したがって、4つのartレコードと5storeつのレコードがあり、そのうちの1つだけが一致するArtNo値を持っている場合、4 x 5-1=19レコードになります。

2番目のクエリartは、どのストアにも存在しないすべてのレコードを表示するだけです。

于 2012-08-08T16:12:52.210 に答える
0

2つのクエリは異なります。最初のクエリは両方のテーブルの結果を結合することです。条件は同じである可能性がありますが、結果に基づくと、2つのテーブル間の1対多の関係になります。

対照的に、2番目のクエリは、2つの結果を結合するのではなく、ARTテーブルから選択し、別のテーブルから指定したアート番号を除外します。

最後に、2番目のクエリがデータベースについて多くのことを知らずに非常に長くかかる理由は推測ですが、私はそれを試してみます。

最初のボトルネックは、明らかに1対1ではない2つのテーブルを結合していることですが、2番目のボトルネックは、おそらくインデックス作成または左側のテーブルのサイズです。JOINのようなJOINでは、左側のテーブルがスキャンされ、理想的には右側がシークであることに注意してください。

それは理にかなっていますか?

于 2012-08-08T16:14:29.553 に答える