2017-03-23 9 views
-2

私のプロシージャのクエリは19.546秒かかるので、下のスナップショットの一番下に表示されます。そして、あなたはそこに60370アイテムの合計データを見ることができます。プロシージャの問合せには多くの時間がかかりますが、19.546秒は長すぎます。プロシージャメソッドを最適化する方法は?

enter image description here

だから、私の手順を最適化する方法はありますか?これは私の手続きです:

BEGIN 
    declare icount int default 0; 
    declare exit handler for SQLEXCEPTION set out_a=1; 
    select count(*) into icount from P01 where P0101=in_a; 
    if icount=0 THEN 
    set out_a=1; 
    set out_b=0; 
    set out_c=''; 
    set out_d=''; 
    ELSE 
    set out_a=0; 
    select P0106,P0107,P0108 into out_b,out_c,out_d from P01 where P0101=in_a; 

    if in_b=1 then 
     select P0202,P0203,P0204,P0205 from P02 where P0201=in_a and P0204=out_b+1 order by P0202; 
    ELSE 
     select P0202,P0203,P0204,P0205 from P02 where P0201=in_a and P0204>=out_b+1 order by P0202; 
    end if; 
    end if; 

END 

手順の時間を短縮する方法はありますか?


EDIT

私は私のテーブルp02を照会する場合は、20 +秒を過ごすことになります:

select * from p02; 

enter image description here

だから、どこ多分問題?

+0

これらのクエリで 'EXPLAIN'を実行すると、インデックスが見つからない箇所が見つかります。 – miken32

+0

@ miken32私は自分の質問を更新すると、テーブルを照会するのにも時間がかかることがわかります。 –

答えて

0
  1. テーブルP02のインデックスを作成します。

    create index i_P0201 on P02(P0201); 
    create index i_P0202 on P02(P0202); 
    create index i_P0204 on P02(P0204); 
    
    create index i_P0101 on P01(P0101); 
    
  2. クエリの算術演算を避ける:P0204>=out_b+1、同じように計算された値を使用します。

    set @out_b_plus1 = out_b+1; 
    

    そしてクエリでその値を使用します。

    `P0204 >= @out_b_plus1` 
    

テーブルのデータが大きいため、最適化のスピードが数秒遅れることがあります。

+0

でも 'select * from p02'も20+ sです。どのような問題が長い時間を引き起こした? –

+0

20秒は、クライアント –

+0

に転送されたデータの量に起因しますが、60kアイテムのデータはクライアントに20 + –

関連する問題