2017-08-22 7 views
0

以下のクエリは時間がかかりすぎてクエリのパフォーマンスを最適化する必要があります。いずれの表にも索引はありません。作成する列を確認する方法パフォーマンスを最適化するためのインデックス

しかし、クエリのパフォーマンスの最適化のために、私はインデックスを作成することを考えています。しかし、私はインデックスを作成する必要がありますparticularyフィルタリング列にはわからない。 私はグループ化を行い、フィルタリングされた列条件のすべてのレコードの個数を数え、次にインデックスを作成する必要がある列を決定しますが、これについてはわかりません。

Select * from ORDER_MART FOL where FOL.PARENT_PROD_SRCID 
IN 
(
select e.PARENT_PROD_SRCID 
from SRC_GRP a 
JOIN MAR_GRP b ON a.h_lpgrp_id = b.h_lpgrp_id  
JOIN DATA_GRP e ON e.parent_prod_srcid = b.H_LOCPR_ID 
WHERE a.CHILD_LOCPR_ID != 0 
AND dt_id BETWEEN 20170101 AND 20170731 
AND valid_order = 1 
AND a.PROD_TP_CODE like 'C%'  
) 
AND FOL.PROD_SRCID = 0 and IS_CAPS = 1; 

以下は私のクエリ実行プランです: enter image description here

+1

どのキーがどのキーで分割されていますか?説明計画は何ですか?インデックスを追加できないのはなぜですか? – Mat

+0

私はクエリの実行計画を追加しました.PRODの権限制限のためにインデックスを追加できません。 – Andrew

+1

'exists'はありますが、相関節はありません。それは疑わしい。 –

答えて

1
Select * 
from ORDER_MART FOL 
    INNER JOIN (
      select distinct e.PARENT_PROD_SRCID 
      from SRC_GRP a 
      JOIN MAR_GRP b ON a.h_lpgrp_id = b.h_lpgrp_id  
      JOIN DATA_GRP e ON e.parent_prod_srcid = b.H_LOCPR_ID 
      WHERE a.CHILD_LOCPR_ID != 0 -- remove the lines from        INT_CDW_DV.S_LOCAL_PROD_GRP_MAIN with child prod srcid equal to 0 
      AND dt_id BETWEEN 20170101 AND 20170731 
      AND valid_order = 1 --and is_caps=1 
      AND a.PROD_TP_CODE like 'C%'  
     ) sub ON sub.PARENT_PROD_SRCID=FOL.PARENT_PROD_SRCID 
where FOL.PROD_SRCID = 0 and IS_CAPS = 1; 

あなたが代わりにINのJOINとサブクエリの行の量を減らすために個別の追加使用している場合。

+0

はい少し速いです。私のクエリは523.968秒で実行され、クエリは438.493秒で実行されています。しかし、それはまだ少しです。私たちはそれをもっと最適化していますか? – Andrew

+1

残念ながら私は盲目的にそれを最適化する魔法はありません:-)。 DBテーブル(列/タイプ)を転記します。サブクエリにさらに制限を適用することは可能ですか?例えば。 'FOL.PROD_SRCID = 0 and IS_CAPS = 1'は行の量を減らすためにサブクエリにも適用できますか? – StanislavL

+0

残念ながら、私がサブクエリに入れることができる追加条件はありません。また、照会テーブルで使用されるCLOBのような特別な列もありません。そのため、通常のvarchar、使用された数値データ型 – Andrew

関連する問題