0

VB で大きなリクエストを生成していますが、かなり大きくなる可能性があります...そして遅くなります。

3 種類のピース (1、2、3) があり、ピースのパッケージの平均湿度が必要なので、リクエストのヘッダーは次のようになります。

SELECT package.id,
CASE WHEN Sum(package.totalPce) = 0 THEN 0 ELSE 
    Sum(nbTooHumid * package.totalPce) / Sum(package.totalPce) END as tooHumid,

次に、nbTooHumid の代わりに nbTooDry で同じことを行い、3 番目として HumidOk を使用します。

さらに、Sum(package.totalPce) で除算して、他のフィールドも計算します。

だから、私は多かれ少なかれ10回呼び出します:

Sum(package.totalPce)

リクエストが非常に長く、実行時間が5秒から2分の間で変動するため、リクエストが遅くなっているのかどうか疑問に思っています。

編集:ゴードンの答えを読んだ後に追加する詳細。

サブリクエストからフィールド nbTooHumid を取得し、リクエストで取得したいすべてのパッケージを、UNION を使用して他のパッケージからマージする必要があります。

そして、pieces テーブルには何百万ものエントリがあるので、そうです、IO の問題です。

また、より完全な例を追加して、私の要求がどのように見えるかを完全に把握できるようにします。

SELECT package.id,
CASE WHEN Sum(package.totalPce) = 0 THEN 0 ELSE 
    Sum(nbTooHumid * package.totalPce) / Sum(package.totalPce) END as tooHumid,
manyOtherFields
FROM 
((SELECT count(*) as totalPce, otherFields
FROM pieces 
WHERE idPackage = X and date between '2012-01-01' and '2012-01-11')
UNION
(SELECT ...)
)

これは私の要求の平均的な形式に過ぎず、正確な構文やフィールド名を使用していないことに注意してください。

4

1 に答える 1

0

パフォーマンスの問題は、使用しているデータベースによって異なります。

ただし、一般に、数値関数は、クエリに必要なデータ操作よりもはるかに高速です。したがって、これがパフォーマンスの問題であるとは思えません。

実行時間が非常に変動しやすい場合は、次の 2 つのいずれかが示唆されます。使用中のサーバーがビジーで、クエリの速度が低下しています。この場合、遅いクエリについてはあまりできません。2 つ目は、長いランが最初のランで、その後は速くなる場合です。これは、データベースがキャッシュされたメモリにテーブルをロードしているためです。後続のクエリの I/O を実行する必要はありません。

ただし、パフォーマンスに関するヘルプが本当に必要な場合は、クエリ全体を投稿する必要があります。

于 2013-01-08T15:42:44.117 に答える