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的方式 你的表的統計資訊 最可能的原因 你的表很小...