66

同じクエリのこれら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

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

両方のクエリプランは同じなので、2つの間に違いはないと思います。

私は正しいですか?

4

4 に答える 4

49

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

于 2012-07-20T07:07:53.690 に答える
15

大きな違いはありません。ただし、バージョン2の外部で結合する必要のある計算や集計などがある場合は、バージョン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 
于 2012-07-20T07:11:27.980 に答える
1

SQLサーバーがクエリに必要のないデータを読み取ろうとしない場合に備えて、同じように見えます。オプティマイザーは十分に賢いです。

複雑なクエリ(つまり、ジョイン、グループ化など)に結合する場合は意味があります。そうです、必須フィールドを指定することをお勧めします。

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

于 2012-07-20T07:11:01.617 に答える
-3

クエリプランからチェックすることで正しいことをしました。しかし、私はバージョン2に100%の自信を持っています。オフレコの数が非常に多い場合は、より高速になります。

私のデータベースには約1,000,000のレコードがあり、これはまさにクエリプランが両方のクエリの違いを示しているシナリオです。さらに、where句を使用する代わりに、結合自体で使用すると、クエリが高速になります
。SELECT p.Name、s.OrderQty
FROM Product p
INNER JOIN(SELECT ProductID、OrderQty FROM SalesOrderDetail)s on p.ProductID = s.ProductID WHERE p.isactive = 1

このクエリのより良いバージョンは次のとおりです。

SELECT p.Name、s.OrderQty
FROM Product p
INNER JOIN(SELECT ProductID、OrderQty FROM SalesOrderDetail)s on p.ProductID = s.ProductID AND p.isactive = 1

(isactiveは、アクティブ/非アクティブな製品を表す製品テーブルのフィールドであると想定しています)。

于 2012-07-20T09:03:18.623 に答える