T-SQL AVGを使用したか、結果がLINQを使用して返された後、平均を取ります
-
20-09-2019 - |
質問
私は6回の平均を引くためにビューを使用するストアドプロシージャを持っています。 SQLデータベースは、私は、クエリアナライザで、それを実行すると、それはおよそ9秒かかりますSQL Serverの2000です。私はより良いパフォーマンスを得るために何ができますか?私は、LINQを使用して行を返すと、そのように平均値を決定する必要がありますか?それは速くなりますか?
ここに私の現在のSPROCの例です。
create procedure [TestAvg]
(
@CustomerNumber int
)
as
select
(select AVG(OrderTime) from OrderDetails where ProductID = 12 and DateDiff(day, DateFulfilled, GetDate()) <= 7 and CustomerNumber = @CustomerNumber) as P12D7,
(select AVG(OrderTime) from OrderDetails where ProductID = 12 and DateDiff(day, DateFulfilled, GetDate()) <= 30 and CustomerNumber = @CustomerNumber) as P12D30,
(select AVG(OrderTime) from OrderDetails where ProductID = 12 and DateDiff(day, DateFulfilled, GetDate()) <= 90 and CustomerNumber = @CustomerNumber) as P12D90,
(select AVG(OrderTime) from OrderDetails where ProductID = 16 and DateDiff(day, DateFulfilled, GetDate()) <= 7 and CustomerNumber = @CustomerNumber) as P16D7,
(select AVG(OrderTime) from OrderDetails where ProductID = 16 and DateDiff(day, DateFulfilled, GetDate()) <= 30 and CustomerNumber = @CustomerNumber) as P16D30,
(select AVG(OrderTime) from OrderDetails where ProductID = 16 and DateDiff(day, DateFulfilled, GetDate()) <= 90 and CustomerNumber = @CustomerNumber) as P16D90
また、私は上記の見解を明確にしましょう。これは、SQL Server 2000のであるので、それはサブクエリを使用しないので、私は、インデックス付きビューを使用することはできません。私は、この結合を使用して書き換えることができると仮定します。しかし、最後の時間は、我々は(サブクエリが行全体を省略しますnull値を返すことができるため)データが欠落して、クエリを取って、結合を使用するためにそれを書き直します。
解決
私は、最初のテーブルのVARに多分2テーブルVARS、16のProductIDのための12のための1と1のデータを取得お勧めします。これらのテーブルVARSから、必要に応じてavgsを計算し、その後、SPからトーセを返します。
DECLARE @OrderDetails12 TABLE(
DateFulfilled DATETIME,
OrderTime FLOAT
)
INSERT INTO @OrderDetails12
SELECT DateFulfilled,
OrderTime
FROM OrderDetails
WHERE ProductID = 12
AND DateDiff(day, DateFulfilled, GetDate()) <= 90
and CustomerNumber = @CustomerNumber
DECLARE @OrderDetails16 TABLE(
DateFulfilled DATETIME,
OrderTime FLOAT
)
INSERT INTO @OrderDetails16
SELECT DateFulfilled,
OrderTime
FROM OrderDetails
WHERE ProductID = 16
AND DateDiff(day, DateFulfilled, GetDate()) <= 90
and CustomerNumber = @CustomerNumber
また、テーブルの上に正しいインデックスを作成、大いに役立つでしょう。
他のヒント
何、それは非凝集した場合、データベース・サーバを残してデータの量は次のようになり、そしてどのくらいこの操作を行うには?データの大きさの差は、サーバ上で計算時間が転送時間とローカル計算を上回るされているか否かを案内します。
また、 - そのDATEDIFF
の使用状況を見て、(DateFullfilled> = SomeCalculatedDate1代わりDATEDIFF
のを試してみてください)、それを最適化可能にするためにやすいように変更する - 求めるインデックスを使用することが可能であることを確認するために、実行計画を見直す(最高)または代わりにtable_scanのインデックス・スキャン(良い)。
また、CustomerNumberの、ProduceID、DateFulfilledにインデックスがあることを確認します。