1

完全に調整できないように見えるので、それを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と同じくらい高速にするべきではありませんか?

助けてくれてありがとう!

4

1 に答える 1

2

2 つのクエリはまったく異なります。違いは非常に微妙ですが、これは次の行です。

        WHERE     StoreID = @StoreID

ビューは、すべての店舗のすべてのデータを計算します。次に、特定の店舗の結果をフィルタリングします。

ストアド プロシージャのバージョンは、特定のストアのみを見ています。StoreId にインデックスがあれば、それを効率的に使用することもできます。

于 2012-08-21T01:37:37.070 に答える