web-dev-qa-db-ja.com

インナージョインvsインナージョイン(SELECT。FROM)

同じクエリのこれら2つのバージョンのパフォーマンスに違いはありますか?

--Version 1
SELECT p.Name, s.OrderQty
FROM Product p
INNER JOIN SalesOrderDetail s on p.ProductID = s.ProductID

--Version 2
SELECT p.Name, s.OrderQty
FROM Product p
INNER JOIN (SELECT ProductID, OrderQty FROM SalesOrderDetail) s on p.ProductID = s.ProductID

DBAによると、バージョン2は内部のSELECTステートメント内で、クエリに必要な列のみをフェッチするため、より高速であると言われたと聞きました。ただし、クエリのパフォーマンスは(影響を受ける行の数と返される列の最終リストに基づいているため)クエリのパフォーマンスは意味をなさないようです。

両方のクエリプランは同一であるため、2つの間に違いはないと推測しています。

私は正しいですか?

51
Karun

あなたは正しいです。オプティマイザーを推測するのではなく、クエリプランをチェックして、まさに正しいことを行いました。 :-)

38

大きな違いはありません。ただし、バージョン2は、外部で結合する必要のある計算、集計などがある場合に簡単です。

--Version 2 
SELECT p.Name, s.OrderQty 
FROM Product p 
INNER JOIN 
(SELECT ProductID, SUM(OrderQty) as OrderQty FROM SalesOrderDetail GROUP BY ProductID
HAVING SUM(OrderQty) >1000) s 
on p.ProductID = s.ProdctId 
10
Madhivanan

SQLサーバーがクエリに不要なデータを読み取ろうとしない場合にのみ同一であると思われる場合、オプティマイザーは十分賢い

複雑なクエリ(つまり、ジョイン、グループ化など)に参加する場合は意味があります。そうです、必須フィールドを指定する方が良いでしょう。

しかし、もう1つポイントがあります。クエリが単純な場合、違いはありませんが、パフォーマンスを向上させることになっている追加のアクションでもオプティマイザーはより困難になり、オプティマイザーは時間内に最適なプランを取得できず、最適なクエリを実行できません。そのため、エクストラの選択は、パフォーマンスを低下させるようなアクションになる可能性があります

0
Vladmir