2016-10-13 3 views
0

私は小さなデータセットとローカルDBに適切に動作しているクエリを持っていますが、生産で、それは時間がかかりすぎる、この上の任意の助けが良いだろう。SQLクエリ

SELECT su.orgid, arc.userid, 
    SUM(IF(arc.create_dt>CURRENT_DATE - INTERVAL 1 WEEK,arc.processed_records,0)) Record_Week, 
    SUM(IF(arc.create_dt>CURRENT_DATE - INTERVAL 1 MONTH,arc.processed_records,0)) Record_Month, 
    SUM(IF(arc.create_dt>CURRENT_DATE - INTERVAL 3 MONTH,arc.processed_records,0)) Record_3Month, 
    SUM(IF(arc.create_dt>CURRENT_DATE - INTERVAL 6 MONTH,arc.processed_records,0)) Record_6Month, 
    SUM(IF(arc.create_dt>CURRENT_DATE - INTERVAL 1 YEAR,arc.processed_records,0)) Record_Year 
FROM archive.log_archive arc 
INNER JOIN prod_db.user su ON su.name = arc.userid 
+1

あなたは 'GROUP BY su.orgid、arc.userid'がありません。パフォーマンスのために、結合されている列に索引があることを確認してください。 – Barmar

+0

既に 'group by'を追加しようとしました –

+0

正しい結果を得るためには、それが必要です。それが間違っていればどれくらい時間がかかります。 – Barmar

答えて

-1

このクエリの種類は時間がかかります。私は、あなたは(あなたのデータベースのサイズとサーバーの構成に応じてmy.iniファイルの変更のMySQLの設定)チューニングMySQLサーバ 2(テーブルのインデックスを確認してください)あなたのクエリを最適化するステップ 1の下

https://mysqltuner.codeplex.com/

をすべきである提案します

http://mysqltuner.com/

0

これは、参加する前にサブクエリで合計を行うために役立つことがありますので、参加から実際のテーブルではなく、一時テーブルを操作することができます。

SELECT su.orgid, su.userid, a.record_week, a.record_month, a.record_3month, a.record_6month, a.record_year 
FROM prod_db.user AS su 
JOIN (SELECT userid, 
     SUM(IF(create_dt>CURRENT_DATE - INTERVAL 1 WEEK,processed_records,0)) Record_Week, 
     SUM(IF(create_dt>CURRENT_DATE - INTERVAL 1 MONTH,processed_records,0)) Record_Month, 
     SUM(IF(create_dt>CURRENT_DATE - INTERVAL 3 MONTH,processed_records,0)) Record_3Month, 
     SUM(IF(create_dt>CURRENT_DATE - INTERVAL 6 MONTH,processed_records,0)) Record_6Month, 
     SUM(IF(create_dt>CURRENT_DATE - INTERVAL 1 YEAR,processed_records,0)) Record_Year 
    FROM archive.log_archive 
    GROUP BY userid) AS arc 
ON su.name = arc.userid 

残念ながら、私は、加算のこのタイプはcreate_dtのインデックスを利用することができるとは思いません。有用なインデックスはuseridnameです。