我在更新的时候使用了如下语句,需要更新的数据(t1表)大约在30万左右,用于查询的表t2数据量在4万左右,这条语句执行起来相当的慢,请问有没有什么好方法可以提高执行的效率呢?update t1 set area=(
  select area from t2
  where substr(t1.number,1,3)=t2.number
)
where exists (
  select area from t2
  where substr(t1.number,1,3)=t2.number
)

解决方案 »

  1.   

    对t1创建函数索引:
    create index ix_t1_substr_num on t1 (substr(number,1,3);
    对t2创建索引:
    create index ix_t2_num on t2 (number);
      

  2.   

    你的数据库版本是9i的吗?
    建完索引后最好用
    analyze table t1 estimate statistics;
    analyze table t2 estimate statistics;
    对两个表都做统计分析,以便oracle 能以最优方式执行查询
      

  3.   

    update t1 set area=(
      select area from t2
      where substr(t1.number,1,3)=t2.number
    )
    where substr(t1.number,1,3) in (select t2.number from t2)
    这样写不知道行不行
    另外在ORACLE的管理平台选中你用到的表和视图,点右键执行分析试一下
      

  4.   

    update t1 
    set area=t2.area
    from t1 join t2 on substr(t1.number,1,3)=t2.number
    这样就好了吧lz
      

  5.   

    update t1 set area=(
    select area from t2
    where t1.number like t2.number||'%'
    )
    where exists (
    select 1 from t2 where t1.number like t2.number||'%')建立函数索引的话比较影响插入数据的速度
    且不好维护,插入数据的时候,需要执行函数,按结果更新索引
    能不用函数就尽量不要用函数索引
      

  6.   

    原来这样子啊为什么这个语句我执行不行呢update t1 
    set area=t2.area
    from t1 join t2 on substr(t1.number,1,3)=t2.number他会告诉我语句未正确结束!