momo zone

调核人的blog

使用join后优化器的索引选择问题

先看一下SQL:

form get_data.
  select mkpf~mblnr mkpf~mjahr  mkpf~budat mkpf~xblnr mseg~zeile mseg~mblnr mseg~matnr  mseg~werks mseg~lgort mseg~bwart mseg~waers mseg~menge  mseg~shkzg  mseg~kdauf  mseg~kdpos  mseg~sgtxt
  into (mkpf-mblnr, mkpf-mjahr,  mkpf-budat,mkpf-xblnr, mseg-zeile,mseg-mblnr,mseg-matnr,mseg-werks,mseg-lgort,mseg-bwart, mseg-waers, mseg menge, mseg-shkzg, mseg-kdauf, mseg-kdpos,mseg-sgtxt)
     from ( mkpf join mseg
        on
             mkpf~mblnr =  mseg~mblnr
        and  mkpf~mjahr =  mseg~mjahr )
  where
       mseg~matnr in s_mat
  and  mseg~werks in s_plt
  and  mseg~lgort in s_stl
  and  mseg~bwart in s_mty
  and  mkpf~budat in s_cdt.

写的好坏不做评论,好在不是我写的~

 

user 反映之前用的很快,今天就慢到不行,没有一次查询到结果(跑得太久), 条件如下:

用st04 去trace SQL ,看起来数据在run ,db很忙碌:

但看detail 发现奇怪的问题:SQL条件和screen的条件不一致! 而且无论screen 的条件是什么SQL的条件却一直不变, 搞了半天没找到什么线索。

 

无奈,去看看索引吧,发现根据where 条件优化器没有选择M索引,而是0 索引。这是一个很明显的性能缺陷,慢的原因就在这里了~~

改where 条件,加强制索引:

………..

 where
       mseg~matnr in s_mat
  and  mseg~werks in s_plt
  and  mseg~lgort in s_stl
  and  mseg~bwart in s_mty
  and  mkpf~budat in s_cdt
  %_HINTS ORACLE ‘INDEX(MSEG~M)’.

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: