在线请教!!!

yyq02271982 2010-10-09 03:35:31
update /*+ parallel(a,50) */ yxql_obj_c a
set jf_grp_id_b = (select jf_grp_id_old
from YXQL_jf_data_ins_cdma b
where a.jf_offer_id = b.jf_offer_id
and a.ib_obj_fk = b.ib_obj_fk
and a.jf_item_id = b.jf_item_id
and rownum = 1);
问一下,这两个表都有索引,但是通过解释器发现只有YXQL_jf_data_ins_cdma这张表的索引启用了部分,yxql_obj_c这张表的索引没有启用,有没有人知道什么时候启用索引的?
...全文
146 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyq02271982 2010-10-09
  • 打赏
  • 举报
回复
没有,用的土办法,建临时表处理了
epsilon-delta 2010-10-09
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 yyq02271982 的回复:]

搞定了,谢谢各位!!!
[/Quote]

是什么问题,说来听听
gelyon 2010-10-09
  • 打赏
  • 举报
回复
咋解决的 分享下
yyq02271982 2010-10-09
  • 打赏
  • 举报
回复
搞定了,谢谢各位!!!
epsilon-delta 2010-10-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yyq02271982 的回复:]

YXQL_jf_data_ins_cdma 这个表有160多万条记录,yxql_obj_c这个表有7万多条记录,我跑了半个多小时还没有跑完,用回滚段查询,数据走的不是很快。
[/Quote]

我怀疑是你的执行计划有些问题,贴上来看看,另外你的确是YXQL_jf_data_ins_cdma中所有数据都要更新吗?
yyq02271982 2010-10-09
  • 打赏
  • 举报
回复
上午跑了一个1.4个亿的数量级的表,也没有这次的跑得这么慢。
yyq02271982 2010-10-09
  • 打赏
  • 举报
回复
YXQL_jf_data_ins_cdma 这个表有160多万条记录,yxql_obj_c这个表有7万多条记录,我跑了半个多小时还没有跑完,用回滚段查询,数据走的不是很快。
Phoenix_99 2010-10-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wkc168 的回复:]
引用楼主 yyq02271982 的回复:
update /*+ parallel(a,50) */ yxql_obj_c a
set jf_grp_id_b = (select jf_grp_id_old
from YXQL_jf_data_ins_cdma b
where a.jf_offer_id = b.jf_offer_id
and a.ib_obj_fk = b.ib_obj……
[/Quote]
你这个没有在外面的where 条件有索引列为条件 是不会走索引
epsilon-delta 2010-10-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yyq02271982 的回复:]

就是说子查询里面用到的外面的表列是不会用到索引的
[/Quote]

对,关联中肯定有一个驱动表,一个被驱动表,驱动表如果自身查询是没有限制条件,自然也就不会使用索引

你的例子里如果加个where条件,就会有使用索引的可能,比如下面的语句,如果jf_offer_id上有索引,就多半会使用索引
update /*+ parallel(a,50) */ yxql_obj_c a
set jf_grp_id_b = (select jf_grp_id_old
from YXQL_jf_data_ins_cdma b
where a.jf_offer_id = b.jf_offer_id
and a.ib_obj_fk = b.ib_obj_fk
and a.jf_item_id = b.jf_item_id
and rownum = 1)
where a.jf_offer_id = ?

心中的彩虹 2010-10-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 yyq02271982 的回复:]
update /*+ parallel(a,50) */ yxql_obj_c a
set jf_grp_id_b = (select jf_grp_id_old
from YXQL_jf_data_ins_cdma b
where a.jf_offer_id = b.jf_offer_id
and a.ib_obj_fk = b.ib_obj_fk
and a.jf……
[/Quote]
你这个没有在外面的where 条件有索引列为条件 是不会走索引
其实你已经并行了 速度应该是可以的
gelyon 2010-10-09
  • 打赏
  • 举报
回复
索引只会提高查询效率,不会提高DML效率,DML语句用索引反而效率低,因为涉及到还要更新字段对应的index
yyq02271982 2010-10-09
  • 打赏
  • 举报
回复
就是说子查询里面用到的外面的表列是不会用到索引的
epsilon-delta 2010-10-09
  • 打赏
  • 举报
回复
你可以这么想,你现在的语句实际是下面这个步骤

1. 从yxql_obj_c取出所有数据
2. 用如上数据去勾连YXQL_jf_data_ins_cdma对应的数据
3. 按YXQL_jf_data_ins_cdma中获取的数据,更新yxql_obj_c

你现在想对yxql_obj_c用索引,可是既然要取出所有数据,走索引就不是高效的,所以oracle不会自动选择索引

另外你这个语句可能会有问题,如果从YXQL_jf_data_ins_cdma不到数据,你的yxql_obj_c中对应的记录的jf_grp_id_b字段是会被更新成null的
gelyon 2010-10-09
  • 打赏
  • 举报
回复
外层更新表不会用index 因为你是更新yxql_obj_c.jf_grp_id_b而不是根据此字段查询
minitoy 2010-10-09
  • 打赏
  • 举报
回复
update语句没where条件,也就是说要更新所有数据,当然不走索引了,走索引会更慢.
yyq02271982 2010-10-09
  • 打赏
  • 举报
回复
yxql_obj_c.jf_grp_id_b这个列式没有建立索引的,其他的列都有索引,这样也起不来?
epsilon-delta 2010-10-09
  • 打赏
  • 举报
回复
你是要勾连更新吧,因为你现在的sql是要更新yxql_obj_c中所有的数据,所以就不会使用索引了

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧