完全に調整できないように見えるので、それをprocに変換して、パラメーターへのクエリ時に使用するWHERE条件の1つを移動し、派生テーブルでパラメーターを使用してみました。
意見
CREATE VIEW myView
AS
SELECT i.ItemCode
, s.StoreID
, ISNULL(SUM(s.TotalSales)) AS Sales
FROM Item i
LEFT JOIN Balance b ON i.ItemCode = b.ItemCode
LEFT JOIN (SELECT SUM(Quantity)
, StoreID
, ItemCode
, Date
FROM Sales
GROUP BY StoreID
, ItemCode
, Date) AS s ON i.ItemCode = s.ItemCode
AND s.Data >= COALESCE(b.Date, '01-01-1900)
JOIN
GROUP BY i.ItemCode
, s.StoreID
ストアドプロシージャ
CREATE PROCEDURE myProc(@StoreID INT)
AS
SELECT i.ItemCode
, s.StoreID
, ISNULL(SUM(s.TotalSales)) AS Sales
FROM Item i
LEFT JOIN Balance b ON i.ItemCode = b.ItemCode
LEFT JOIN (SELECT SUM(Quantity)
, StoreID
, ItemCode
, Date
FROM Sales
WHERE StoreID = @StoreID
GROUP BY StoreID
, ItemCode
, Date) AS s ON i.ItemCode = s.ItemCode
AND s.Data >= COALESCE(b.Date, '01-01-1900)
JOIN
GROUP BY i.ItemCode
, s.StoreID
EXEC myProc(100)は、SELECT * FROM myView WHERE StoreID = 100よりもはるかに高速です。これは当てはまりますか?
注:このコードは完全に意味をなさないか、実行されない可能性があることを私は知っています-私は他のいくつかのJOINを削除することによってそれを単純化しようとしました。実際のコードの唯一の実質的な違いは、WHEREを派生テーブルに移動することです。これはここで行いました。
ビューは、派生テーブルのクエリを実行するときに私のWHEREを考慮に入れて、procと同じくらい高速にするべきではありませんか?
助けてくれてありがとう!