COEPの抽出
- このフォーラムに新規トピックを投稿できます
- このフォーラムではゲスト投稿が許可されています
- このトピックは管理者もしくはモデレータによりロックされています。
COEPの抽出
msg# 1
ゲスト
テーブル:COEPからのSELECTのパフォーマンスが悪く困っています。SELECT文は以下の通りです。COEPの全エントリは3600万程です。索引は当っているのですが、時間がかかってしまいます。良い案があれば教えて下さい。
SELECT BELNR
BUZEI
PERIO
WKGBTR
OBJNR
GJAHR
KSTAR
GKONT
WERKS
MATNR
GKOAR
EBELN
EBELP
SGTXT
MEINB
MEINB
FROM COEP
INTO TABLE ITAB_COEP
FOR ALL ENTRIES IN ITAB_WBS
WHERE KOKRS = '1000'
AND LEDNR = '00'
AND OBJNR = ITAB_WBS-OBJNR
AND GJAHR >= P_GJAHRS "パラメータ:開始年度
AND GJAHR <= P_GJAHRE "パラメータ:終了年度
AND WRTTP = '04'
AND VERSN = '000'
AND KSTAR IN S_KSTAR "パラメータ:原価要素
AND HRKFT = SPACE
%_HINTS ORACLE 'INDEX("COEP" "COEP~1")'.
SELECT BELNR
BUZEI
PERIO
WKGBTR
OBJNR
GJAHR
KSTAR
GKONT
WERKS
MATNR
GKOAR
EBELN
EBELP
SGTXT
MEINB
MEINB
FROM COEP
INTO TABLE ITAB_COEP
FOR ALL ENTRIES IN ITAB_WBS
WHERE KOKRS = '1000'
AND LEDNR = '00'
AND OBJNR = ITAB_WBS-OBJNR
AND GJAHR >= P_GJAHRS "パラメータ:開始年度
AND GJAHR <= P_GJAHRE "パラメータ:終了年度
AND WRTTP = '04'
AND VERSN = '000'
AND KSTAR IN S_KSTAR "パラメータ:原価要素
AND HRKFT = SPACE
%_HINTS ORACLE 'INDEX("COEP" "COEP~1")'.
投票数:180
平均点:3.06
Re: COEPの抽出
msg# 1.1
ishikawa
投稿数: 10
%_HINTS ORACLE 'INDEX("COEP" "COEP~1")'.
こんな構文が可能なんですね。
このヒント文は(テーブルCOEPのインデックス"COEP~1"を使うと効率が良い)
という事になると思います。
COEP~1は一次インデックスというか、主キーのインデックスですが
このキーとWHERE条件が一致していないので、このインデックスをつかえておらず
FULL SCANされていると推測しています。
手っ取り早い解消方法といえば、現在の抽出条件に利用している項目の単位で二次インデックスを
作成し、ヒント文でその追加したインデックス(COEP~2)を指定すれば解消すると思います。
(もちろんその後DBの統計情報更新も。)
効果はデータの分布状態(インデックスの効率)にもよりますが十倍から数十倍の効果がでる場合もあります。
また、効果があるか定かではないですがインデックスが貼られた項目順に
WHERE条件も並べておいた方がお作法的には良いような気はします。
※ただし、インデックスが増える分COEPの更新する他の処理に影響が出ますので
コアなテーブルへの二次インデックス作成はBASIS担当の方と相談の上行った方が良いと思います。
それと初歩的ですが実装していると意外と忘れがちな件です。
"FOR ALL ENTRIES"は指定した内部テーブル(ITAB_WBS)が0件の場合
WHERE条件そのものが無効となる罠がありますが、これに該当していないでしょうか?
パラメータで指定されている会計年度・原価要素等の抽出条件も無効となりますので
この場合ですと全件(3,600万件)を抽出しに行きます。
<ご参考>
http://abap.sblo.jp/article/13768651.html
テーブルのキー情報だけで一度内部テーブルへ抽出して
対象外データを内部テーブルからDeleteする方法の検討もありかと思います。
DB負荷をアプリ側に持ってきただけなので
アルゴリズムとしてはイマイチですが、結果としてパフォーマンスが向上する場合もあります。
いずれにしてもSAP全般的に"年度"を跨る抽出は遅くなると思います。
パフォーマンスについては、ある程度はやむなしな気はします。
こんな構文が可能なんですね。
このヒント文は(テーブルCOEPのインデックス"COEP~1"を使うと効率が良い)
という事になると思います。
COEP~1は一次インデックスというか、主キーのインデックスですが
このキーとWHERE条件が一致していないので、このインデックスをつかえておらず
FULL SCANされていると推測しています。
手っ取り早い解消方法といえば、現在の抽出条件に利用している項目の単位で二次インデックスを
作成し、ヒント文でその追加したインデックス(COEP~2)を指定すれば解消すると思います。
(もちろんその後DBの統計情報更新も。)
効果はデータの分布状態(インデックスの効率)にもよりますが十倍から数十倍の効果がでる場合もあります。
また、効果があるか定かではないですがインデックスが貼られた項目順に
WHERE条件も並べておいた方がお作法的には良いような気はします。
※ただし、インデックスが増える分COEPの更新する他の処理に影響が出ますので
コアなテーブルへの二次インデックス作成はBASIS担当の方と相談の上行った方が良いと思います。
それと初歩的ですが実装していると意外と忘れがちな件です。
"FOR ALL ENTRIES"は指定した内部テーブル(ITAB_WBS)が0件の場合
WHERE条件そのものが無効となる罠がありますが、これに該当していないでしょうか?
パラメータで指定されている会計年度・原価要素等の抽出条件も無効となりますので
この場合ですと全件(3,600万件)を抽出しに行きます。
<ご参考>
http://abap.sblo.jp/article/13768651.html
テーブルのキー情報だけで一度内部テーブルへ抽出して
対象外データを内部テーブルからDeleteする方法の検討もありかと思います。
DB負荷をアプリ側に持ってきただけなので
アルゴリズムとしてはイマイチですが、結果としてパフォーマンスが向上する場合もあります。
いずれにしてもSAP全般的に"年度"を跨る抽出は遅くなると思います。
パフォーマンスについては、ある程度はやむなしな気はします。
投票数:167
平均点:4.37
Re: COEPの抽出
msg# 1.2
ゲスト
質問者です。
ご回答ありがとうございましたm( _ _ )m
ご回答ありがとうございましたm( _ _ )m
投票数:140
平均点:5.29
Re: COEPの抽出
msg# 1.3
abapやってます
横からすいません。
遅いかもしれませんが、気になったので訂正を。
そのHINT文は標準の二次インデックスを指定していますので、
検索条件としては正しと思われます。
ちなみに、テーブルインデックスの場合は番号が0ですね。
年度が範囲指定になってますので、in文にして等号検索になるようにしてください。
rangeテーブルのoption eq レコードを範囲文設定するロジック組んで使用してください。
ベストは範囲指定させないかと思いますが…。
メモリに余裕があるのならfor all は件数が多いとパフォーマンスが悪いので、
検索条件を緩くしてみるのも手です。
遅いかもしれませんが、気になったので訂正を。
そのHINT文は標準の二次インデックスを指定していますので、
検索条件としては正しと思われます。
ちなみに、テーブルインデックスの場合は番号が0ですね。
年度が範囲指定になってますので、in文にして等号検索になるようにしてください。
rangeテーブルのoption eq レコードを範囲文設定するロジック組んで使用してください。
ベストは範囲指定させないかと思いますが…。
メモリに余裕があるのならfor all は件数が多いとパフォーマンスが悪いので、
検索条件を緩くしてみるのも手です。
投票数:166
平均点:4.82
Re: COEPの抽出
msg# 1.4
ゲスト
質問者です。
ご回答ありがとうございます。
ちなみにfor allをやめてビューにしてみたらどうかと思っているのですが、ビューの方がパフォーマンスはいいでしょうか?
ご回答ありがとうございます。
ちなみにfor allをやめてビューにしてみたらどうかと思っているのですが、ビューの方がパフォーマンスはいいでしょうか?
投票数:105
平均点:5.43