0

私が働いている会社用に単純なビジネス分析アプリケーションを作成しており、過去 6 年間の販売取引の 100 MB の csv ファイルをいくつかのデータベースに解析しています。

アプリケーションで表示したい数値の 1 つは、顧客ごとの 1 日あたりの売上高と利益であるため、while ループは次のようになります。

while(start_date < current_date)
    {
        SELECT SUM(profit), SUM(turnover) FROM sales WHERE date = @date
    }

そのため、6 年間毎日顧客がいるのと同じ回数、数十万行のテーブルでそのクエリを実行しています。

私は常に、DB で実行できるすべての作業を実行する必要があると信じていました。そのため、SUM クエリを使用して列を合計しました。

他にどのような最適化を行うことができますか? 現時点では...まあ、8GBのクアッドコアサーバーで過去1時間実行されており、約2〜3%であるように見えるため、わかりません.

私は SQL Server Compact Edition を使用しています。これは C#/.NET の winforms アプリケーションですが、ここでは明らかに db がボトルネックになっています。

4

2 に答える 2

1

この (変更された) クエリを 1 回だけ実行し、結果セットをループします。それはずっと速いはずです。

SELECT 
    customer, date, SUM(profit), SUM(turnover) 
FROM 
    sales 
WHERE 
    date < current_date 
GROUP BY 
    customer, date
ORDER BY
    customer, date

for each (row in resultset) {
    //process customer/date
}
于 2012-08-31T15:03:41.660 に答える
0

毎日の統計が表示される要約テーブルを導入してみてください。sales テーブルにデータを追加するたびに、[トリガーまたはアプリケーション ロジックを使用して] そのサマリー テーブルを更新します。

于 2012-08-31T14:52:19.887 に答える