0

ビューを使用して6つの平均をプルするストアドプロシージャがあります。SQLデータベースはSQLServer2000です。クエリアナライザーで実行すると、約9秒かかります。パフォーマンスを向上させるために何ができますか?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

また、上記の見方を明確にさせていただきます。これはSQLServer2000であるため、サブクエリを使用するため、インデックス付きビューを使用できません。これは、結合を使用するように書き直すことができると思います。ただし、前回クエリを取得して結合を使用するように書き直したとき、データが欠落していました(サブクエリがnull値を返し、行全体が省略される可能性があるため)。

4

2 に答える 2

2

データベースサーバーが集約されていない場合、データベースサーバーを離れるデータの量はどのくらいになり、その操作を実行するのにどのくらいの時間がかかりますか?データのサイズの違いにより、サーバーでの計算時間が転送時間とローカル計算よりも重要であるかどうかがわかります。

また、そのDATEDIFF使用法を確認し、最適化しやすいように変更します(代わりにDateFullfilled> = SomeCalculatedDate1を試しDATEDIFFてください)-実行プランを確認して、インデックスシーク(最良)またはインデックススキャン(良好)を使用できることを確認しますtable_scanの代わりに。

また、CustomerNumber、ProduceID、DateFulfilledにインデックスがあることを確認してください。

于 2009-11-18T17:11:02.933 に答える
1

最初にデータをテーブル変数に入れることをお勧めします。おそらく2つのテーブル変数、1つは12、1つは16のProductIDです。これらのテーブル変数から、必要に応じて平均を計算し、spからtoseを返します。

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

また、テーブルに正しいインデックスを作成すると、非常に役立ちます。

于 2009-11-18T17:06:12.750 に答える