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这张表的索引没有启用,有没有人知道什么时候启用索引的?

解决方案 »

  1.   

    你是要勾连更新吧,因为你现在的sql是要更新yxql_obj_c中所有的数据,所以就不会使用索引了
      

  2.   

    yxql_obj_c.jf_grp_id_b这个列式没有建立索引的,其他的列都有索引,这样也起不来?
      

  3.   

    update语句没where条件,也就是说要更新所有数据,当然不走索引了,走索引会更慢.
      

  4.   

    外层更新表不会用index 因为你是更新yxql_obj_c.jf_grp_id_b而不是根据此字段查询
      

  5.   

    你可以这么想,你现在的语句实际是下面这个步骤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的
      

  6.   

    索引只会提高查询效率,不会提高DML效率,DML语句用索引反而效率低,因为涉及到还要更新字段对应的index
      

  7.   

    你这个没有在外面的where 条件有索引列为条件 是不会走索引 
    其实你已经并行了 速度应该是可以的
      

  8.   


    对,关联中肯定有一个驱动表,一个被驱动表,驱动表如果自身查询是没有限制条件,自然也就不会使用索引你的例子里如果加个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 = ?
      

  9.   

    你这个没有在外面的where 条件有索引列为条件 是不会走索引 
      

  10.   

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

  11.   


    我怀疑是你的执行计划有些问题,贴上来看看,另外你的确是YXQL_jf_data_ins_cdma中所有数据都要更新吗?