3

パフォーマンスの問題を引き起こしている T-SQL クエリがあります。分厚いものですが、問題を引き起こしていると思われる部分は単純な LEFT JOIN です。

これは、左の結合を削除し、選択でサブクエリを使用することで解決できますが、一方がすばやく機能し、他方が機能しない理由がわからないため、これは私には不十分なようです。

関連するデータはそれほど多くなく、すべての結合列にキー/インデックスがあります。私が疑問に思っていたのは、データベースの統計と、それらがパフォーマンスに影響を与えているかどうかということだけでした。

たとえば ( Nb これは、はるかに複雑なクエリを単純化したものにすぎません

スロー

SELECT A.1,A.2,B.3 FROM A LEFT JOIN B ON A.ID = B.ID ...

速い

SELECT A.1, A.2, (SELECT B.3 FROM B WHERE B.ID = A.ID) FROM A

4

2 に答える 2

1

一般に、サブクエリは通常、左結合よりも遅くなるため、何か他のことが起こっているに違いありません。

最初にクエリ全体を表示します。これは、表現するために ... を使用した部分に問題がある可能性があるためです。

次に、実行計画を確認し、違いを確認します。そして、id列にインデックスがあることを絶対に確信していますか。FK 制約では、自動的にインデックスが作成されません。

両方のクエリが同じレコードを返しますか? 1 つは他のものと同等ではないため、より高速である可能性があります。

于 2010-09-15T13:42:23.850 に答える
0

これら 2 つのクエリは同等ではない可能性があります。サブクエリの場合:

(SELECT B.3 FROM B WHERE B.ID = A.ID)

複数の行を返す場合、左の結合は2行だけを返しますが、サブクエリは「サブクエリが複数の行を返しました」と不平を言って爆発します。B.ID が一意の場合、オプティマイザはそれを認識していますか? 一意の制約またはインデックスがありますか?

于 2010-09-15T13:26:20.003 に答える