診斷一句SQL不走索引的原因

2021-09-06 17:07:10 字數 2170 閱讀 9153

from

有論壇朋友在上面的帖子裡問sql為什麼不走索引,正好這兩天我也剛剛在看sql優化,於是試著回答了一下.

下面是原來的sql:

select o.order_id as orderid  from order_info o, member m

where m.member_id = o.member_id

and o.is_delete = 'n'

/*and (to_date(nvl(o.paid_time,o.commit_time), 'yyyy-mm-dd hh24:mi:ss') >=

to_date('2014-03-27 00:00:00', 'yyyy-mm-dd hh24:mi:ss'))

and (to_date(nvl(o.paid_time,o.commit_time), 'yyyy-mm-dd hh24:mi:ss') <=

to_date('2014-03-27 23:59:59', 'yyyy-mm-dd hh24:mi:ss'))*/

and o.commit_time like '2014-03-27%'

and ((o.payment_mode = 'kdfh' and o.is_paid = 'y') or

(o.payment_mode = 'hdfk'))

and o.order_state not in (18, 19, 25)

and (exists (select 1

from fecerp.sys_role_select rs, fecerp.sys_role_user su

where su.role_id = rs.role_id

and su.user_id = 3132

and su.is_delete = 'n'

and rs.othera = 0) or exists

(select 1

from fecerp.sys_role_select   rs,

fecerp.sys_role_user     su,

product_yw_catalog       pyc,

product_yw_catalog_goods ycg,

order_item               oi

where su.role_id = rs.role_id

and pyc.yw_catalog_id = ycg.wy_catalog_id

and su.user_id = 3132

and rs.othera <> 0

and su.is_delete = 'n'

and ',' || rs.bus_ids || ',' like

'%,' || pyc.yw_catalog_id || ',%'

and oi.order_id = o.order_id

and oi.is_delete = 'n'

and ycg.goods_no = oi.goods_no))

and (select m.multi_channel_id

from ec_multi_channel m

where m.multi_channel_id = o.multi_channel_id) in

(select ser.multi_channel_id

from fecerp.sys_role_channel ser, fecerp.sys_role_user uss

where ser.role_id = uss.role_id

and ser.is_delete = 'n'

and uss.is_delete = 'n'

and uss.user_id = 3132)

執行計畫:

order_info 索引如下:

和統計資訊的關係不大,至少表order_info 的統計資訊是正確的,否則table full access的cost不會這麼高. 

不走索引應該是下面的原因.

推薦在 payment_mode  和 is_paid 上建立乙個組合索引.

不走索引的原因

補充 不走索引的原因,甚至加上hint 還不走索引,那可能是因為你要走索引的這列是nullable,雖然這列沒有空值。將字段改為not null 備註 不走索引的其它原因1 建立組合索引,但查詢謂詞並未使用組合索引的第一列,此處有乙個index skip scan概念。2 在包含有null值的tab...

怎麼看一句 查詢sql 是否走索引

我們只需要注意乙個最重要的type 的資訊很明顯的提現是否用到索引 type結果值從好到壞依次是 system const eq ref ref fulltext ref or null index merge unique subquery index subquery range index a...

Oracle不走索引的原因

在oracle資料庫操作中,為什麼有時乙個表的某個字段明明有索引,當觀察一些語的執行計畫確不走索引呢?如何解決呢?本文我們主要就介紹這部分內容,接下來就讓我們一起來了解一下 不走索引大體有以下幾個原因 你在instance級別所用的是all rows的方式 你的表的統計資訊 最可能的原因 你的表很小...