UPDATE t
SET t.name = (SELECT a.name
                FROM a
               WHERE a.id = t.id )
我现在的情况是:表a有100万条数据,无论有没有对a.id建索引,执行时间都是一样很长。请问,有没有使用到表a的索引?

解决方案 »

  1.   

    你是用的什么优化方式?CBO?
    要你自己看执行计划才知道用没用索引。别人能猜出来用没用?
      

  2.   

    UPDATE t 
    SET t.name = (SELECT a.name 
                    FROM a 
                  WHERE a.id = t.id ) 
    如果是一对一的更新
    加条件语句:
    where exists (select 1 from a where a.id=t.id)
      

  3.   

    还是不太明白。
    t中有100条记录,a中有100万条记录,无论有没有对a.id建索引,执行时间都是30秒。to cosio:好像那样子更慢吧。
      

  4.   

    建个下面的index试试:
    create index i_test on a(id,name) compute statistics;
      

  5.   

    数据库越跑越慢了。我把t表truncate掉,重新塞100条记录进去。现在变成了有索引时用47秒,没索引时用127秒,而且硬盘灯也比先前亮了。各位老大,会不会是数据库的存储空间配置的问题啊?
    我的内存是这样开的:共享池:400M,缓冲区高速内存:304M,大型池:104M,Java池:104M。
      

  6.   

    受不了了,重新提问。这里:
    http://topic.csdn.net/u/20080916/14/b42f0028-854d-43ab-803f-eb30f788526f.html
      

  7.   

    如果t.id,a.id都有索引的话,t应该是索引扫描,a是索引查找,刚学oracle不太懂,mssql是这样,在优化方面估计也差不多
      

  8.   

    不知oracle能不能这样写update t set t.name = tbl.name

    select id,name from a 
    )tbl
    where t.id = tbl.id
      

  9.   

    漏了fromupdate t set t.name = tbl.name
    from

    select id,name from a 
    )tbl 
    where t.id = tbl.id
      

  10.   

    update (select a.avalue av, b.bvalue bv 
              from testa a, testb b 
            where a.cellid = b.cellid ) 
        set av = bv; 
    这样写,索引肯定生效。
      

  11.   

    UPDATE t 
    SET t.name = (SELECT /*+ index(a index_a)*/a.name 
                    FROM a 
                  WHERE a.id = t.id ) 
    -----------
    使用hint进行强制索引试试.
      

  12.   

    SQL> set timing on
    SQL> set autot trace only
    SQL> update t
      2  SET t.name = (SELECT a.name FROM a WHERE a.id = t.id )
      3  /
    ...
    执行计划
    ----------------------------------------------------------
    Plan hash value: ...------------------------------------------------------------------------------
    | Id  | Operation          | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------
    ...
    ------------------------------------------------------------------------------
    统计信息
    ----------------------------------------------------------
              0  recursive calls
              8  db block gets
              7  consistent gets
              1  physical reads
           1688  redo size
            668  bytes sent via SQL*Net to client
            571  bytes received via SQL*Net from client
              4  SQL*Net roundtrips to/from client
              1  sorts (memory)
              0  sorts (disk)
              6  rows processed
    麻烦楼主把set autot trace only后,加索引和不加索引的执行结果分别贴上来。
      

  13.   

    原来,在pl/sql中按F5就可以看执行计划了。。汗散分个