2016-12-14 10 views
0

私は約1,300万行のテーブルを持っています。各行は、特定の日の特定の時間の特定のプロジェクトの特定のタイプの測定値を表します。非常に遅いクエリの結果セットのキャッシュ

私は、測定値のタイプに応じてこれらの値の合計または平均を求めるクエリを持っています。それは数分のように非常に遅いです。

このクエリの結果を利用する特定のレポートページがありますが、ページが読み込まれるまでに数分かかることはありません。これまでの私の解決策は、私がサマリーテーブルと呼んでいるものにクエリの結果をキャッシュすることでした。

サマリーテーブルをリフレッシュする夜間実行スクリプトが実行に時間がかかりすぎるという問題があります。私は一度に全体の要約テーブルをリフレッシュしようとしていませんが、それでも時間がかかります。 (「長すぎる」とは、エラーが発生し、リフレッシュジョブが完了していないことを意味します)。

私が直面している課題は間違ったやり方で起こった結果であり、解決策は、質問の実行時間を1%ずつ減らすためにいくつか調整するのではなく、まったく異なる方法で問題にアプローチすることです。

何か提案がありがとうございます。この質問を非常にうまくやっていないと謝ります。私はそれをより良く策定する方法がわかりません。明確化または詳細を提供することを喜んで。

これは、永遠に実行されるクエリの簡略化されたバージョンです。 (でもこの単純化されたバージョンは、かなり長い時間がかかります。)

select date(calc_dt), 
     project_id, 
     calculation_type_cd, 
     sum(result) 
    from calc_calculation_results 
group by date(calc_dt), 
     project_id, 
     calculation_type_cd 

毎晩仕事は、基本的には、このクエリの結果を受け取り、自分のサマリーテーブルにそれらを置くSELECT INTOです。 result列は、レポートの目的で興味を持っている値です。

+0

あなたはどのインデックスを利用していますか?どのようなエラーが発生していますか?あなたはクエリがちょっと死ぬと言っていますか? –

+2

本当にジェイソンは14Kの代理人と、あなたは本当にこのような不明瞭な質問は答えられないことを知っておくべきです。 – RiggsFolly

+0

@TimBiegeleisen私は起こった[このエラー](http://stackoverflow.com/questions/5836623/getting-lock-wait-timeout-exceeded-try-restarting-transaction-even-though-im) 5年ほど前に別の質問をしてください。私のテーブル上の 'SHOW INDEX FROM'はいくつかの指標を示していますが、何が関連しているかを知る方法はわかりません。 –

答えて

0

要約表 - 良い。それらを再建する - 悪い。代わりに、毎晩増分的に増やしてください。

サマリーテーブルでは、メインテーブルに必要なインデックスがほとんどないため、読み込み効率が向上します。

サマリーテーブルには、クエリに適したインデックスがあります。あなたの簡易版は、それが持つかもしれない

INSERT INTO Summary (date, project_id, type_cd, sum_result) 
    select CURDATE() - INTERVAL 1 DAY, 
      project_id, 
      calculation_type_cd, 
      sum(result) 
    from calc_calculation_results 
    WHERE calc_dt >= CURDATE() - INTERVAL 1 DAY 
     AND calc_dt < CURDATE() 
    group by project_id, 
      calculation_type_cd 

になる可能性があります

More discussion of Summary Tables

PRIMARY KEY(date, project_id, type_cd), 
INDEX(project_id, date), 
INDEX(type_cd, date) 
関連する問題