私のデータベースはSQLServer2005DBに保存されています。
このクエリの実行には1秒もかかりません。
SELECT * FROM (
SELECT ROW_NUMBER() OVER ( ORDER BY tblOrders.orderid ) AS RowNum,
SUM(tblProducts.Price) as price
FROM tblOrders
LEFT OUTER JOIN tblOrderDetails ON tblOrders.orderid = tblOrderDetails.OrderId
LEFT OUTER JOIN tblProducts ON tblOrderDetails.ProductId = tblProducts.ProductId
GROUP BY tblOrders.orderid
) as x
where RowNum >= 21001 and RowNum < 21011
このクエリの実行には10秒かかります。
SELECT * FROM (
SELECT ROW_NUMBER() OVER ( ORDER BY tblOrders.orderid ) AS RowNum,
SUM(tblProducts.Price) as price,
OrderDate
FROM tblOrders
LEFT OUTER JOIN tblOrderDetails ON tblOrders.orderid = tblOrderDetails.OrderId
LEFT OUTER JOIN tblProducts ON tblOrderDetails.ProductId = tblProducts.ProductId
GROUP BY tblOrders.orderid, tblOrders.OrderDate
) as x
where RowNum >= 21001 and RowNum < 21011
なぜそのような違いがあるのでしょうか?
すべてのテーブルには、主キーを保持するidという列があります。データベースを設計しなかったので、orderidとProductIdが存在する理由がわかりません。
/バリー
アップデート
OrderDateは日時です
2回目の更新
3つのテーブルにはそれぞれ、主キーとして機能するid列があることを忘れないでください。ただし、テーブル間を参照する場合は、orderid、productidなどが使用されます。なぜこのように実装されたのかはわかりませんが、非常に間違っていると思います。
tblOrders:
Id; int; no null; PK
OrderId; int; allow null
OrderDate; datetime; allow null
tblOrderDetails:
Id; int; no null; PK
OrderId; int; allow null
ProductId; int; allow null
tblProducts:
Id; int; PK; no null
ProductId; allow null
Price; money; allow null
これはクエリ実行プランに関して適切ですか?-
3番目の更新
これは実行に1秒しかかかりません-
SELECT ROW_NUMBER() OVER ( ORDER BY tblOrders.orderid ) AS RowNum,
SUM(tblProducts.Price) as price,
OrderDate
FROM tblOrders
LEFT OUTER JOIN tblOrderDetails ON tblOrders.orderid = tblOrderDetails.OrderId
LEFT OUTER JOIN tblProducts ON tblOrderDetails.ProductId = tblProducts.ProductId
GROUP BY tblOrders.orderid, OrderDate
そしてこれはたった2秒-
SELECT * FROM (
SELECT ROW_NUMBER() OVER ( ORDER BY tblOrders.orderid ) AS RowNum,
SUM(tblProducts.Price) as price,
MAX(tblOrders.OrderDate) as OrderDate -- do this instead of grouping
FROM tblOrders
LEFT OUTER JOIN tblOrderDetails ON tblOrders.orderid = tblOrderDetails.OrderId
LEFT OUTER JOIN tblProducts ON tblOrderDetails.ProductId = tblProducts.ProductId
GROUP BY tblOrders.orderid ) as x
しかし、これには10秒かかります-
SELECT * FROM (
SELECT ROW_NUMBER() OVER ( ORDER BY tblOrders.orderid ) AS RowNum,
SUM(tblProducts.Price) as price,
MAX(tblOrders.OrderDate) as OrderDate -- do this instead of grouping
FROM tblOrders
LEFT OUTER JOIN tblOrderDetails ON tblOrders.orderid = tblOrderDetails.OrderId
LEFT OUTER JOIN tblProducts ON tblOrderDetails.ProductId = tblProducts.ProductId
GROUP BY tblOrders.orderid ) as x
where RowNum >= 21001 and RowNum < 21011
where句は8秒を追加しています。なんで?