Table1(SFZHM,SGJL,JWH)
Table2(SFZHM,,JWH)
Table1有记录486000条,Table2有记录1000条.
Table1和Table2都把SFZHM设为索引.
(1)用Pul Sql执行选择语句.
Select Table1.SFZHM,Table2.JWH From Table1,Table2 
       Where Table1.SFZHM=Table2.SFZHM;
很快就把查询到的44条记录列了出来.
(2)用Pul Sql执行更新语句.
Update Table1 Set Jwh=(Select Jwh From Table2
       Where Table1.SFZHM=Table2.SFZHM);
结果很久也没有执行的结果,象是死机一样。
是为什么呢?数据量太大?哪为什么选择语句就这么快?
请各位指教指教,怎样才能提高Update的处理速度,多谢!

解决方案 »

  1.   

    我觉得Table1是个大表
    Update Table1 Set Jwh=(Select Jwh From Table2
           Where Table1.SFZHM=Table2.SFZHM);没有对其做限制,更新的时候从第一条开始执行486000次,每次都去找,就比较慢
    加上一个限制不:
    Update Table1 Set Jwh=(Select Jwh From Table2
           Where Table1.SFZHM=Table2.SFZHM)
    where Table1.SFZHM in (
    Select Table1.SFZHM Where Table1.SFZHM=Table2.SFZHM;
    );
    不知道这个怎么样,你试验一下
      

  2.   

    转贴:
    根据Oracle优化路径
    rule 模式下的规则:1、有两个索引存在的情况下,from后面大表在前。小表(返回记录少的表,不是记录少的表)在最后,作为驱动表,Oracle处理SQL语句是从左到右2、有一个索引,则顺序无关3、都没有索引,则大表应该在后
    要根据有无索引,详细如下:表A有N行数据,符合连接条件的行树为A1,表B有M行数据,符合连接条件的行树为B1 
    1.A,B两表均无索引 
    如果A表驱动,则A表扫描一次,B表扫描A1次.   磁盘访问次数为:N+A1*M;                
    如果B表驱动,则B表扫描一次,A表扫描B1次.    磁盘访问次数为:M+B1*N; 
    2.A表无索引,B表有索引 
    如果A表驱动,则A表扫描一次,B表查A1次索引. 磁盘访问次数为:N+A1*LOG(M)/LOG(2);      
    如果B表驱动,则B表查一次索引,A表扫描B1次.    磁盘访问次数为:LOG(M)/LOG(2)+B1*N 
    3.A表有索引,B表无索引 
    如果B表驱动,则B表扫描一次,A表查B1次索引. 磁盘访问次数为:M+B1*LOG(N)/LOG(2);            
    如果A表驱动,则A表查一次索引,B表扫描B1次.    磁盘访问次数为:LOG(M)/LOG(2)+B1*N      
    4.A,B表均有索引
    如果A表驱动,则A表查一次索引,B表查A1次索引. 
    磁盘访问次数:LOG(M)/LOG(2)+A1*LOG(N)/LOG(2);
    如果B表驱动,则B表查一次索引,A表扫描B1次.   
    磁盘访问次数为:B1*LOG(M)/LOG(2)+LOG(N)/LOG(2)
      

  3.   

    我觉得你的这个句子有问题:
    Update Table1 Set Jwh=(Select Jwh From Table2
           Where Table1.SFZHM=Table2.SFZHM);
    查询:Select Jwh From Table2
           Where Table1.SFZHM=Table2.SFZHM);
    可那为一个集合
    而你却用的是:jwh=
    你把"=" 换成in 试一下
      

  4.   

    Update Table1 Set Jwh=(Select Jwh From Table2
           Where Table1.SFZHM=Table2.SFZHM)
    where Table1.SFZHM ='442562565875848';也是这么慢,不如用游标逐条更新,各位有何看法!
      

  5.   

    你用这条语句试一下
    Update Table1 
    Set Jwh=(Select Jwh From Table2 Where Table1.SFZHM=Table2.SFZHM)
    where sfzhm=(select sfzhm From Table2 Where Table1.SFZHM=Table2.SFZHM);
      

  6.   

    试一试Update Table1 Set Jwh='123'有多快?
      

  7.   

    显然:Update Table1 Set Jwh=(Select Jwh From Table2
           Where Table1.SFZHM=Table2.SFZHM)
    我认为有问题。由于每一次都要查询Table2这个表,所以会很慢。
    另外,如果不是对SFZHM建立唯一索引,可能出错。如果不是非要一次性写完,可以食用游标,会很快的。
      

  8.   

    同意jack_4826(天下无双)  
    Update Table1 
    Set Jwh=(Select Jwh From Table2 Where Table1.SFZHM=Table2.SFZHM)
    where sfzhm=(select sfzhm From Table2 Where Table1.SFZHM=Table2.SFZHM);
    的写法,效率可以提高不少。 另外,如果字段jwh 有索引最好删除,然后再建立。
      

  9.   

    如果,
    Select Table1.SFZHM,Table2.JWH 
      From Table1,Table2 
     Where Table1.SFZHM=Table2.SFZHM;
    非常快,则建一个view 
    create view view1 as 
    Select Table1.SFZHM,Table2.JWH 
      From Table1,Table2 
     Where Table1.SFZHM=Table2.SFZHM;
    应该快,
    再UPDATE。如何。
      

  10.   

    改为:
    Update Table1 Set Jwh=(Select Jwh From Table2
           Where Table1.SFZHM=Table2.SFZHM 
        and rownum<=1);
    试一下,
    和下面的贴子类似:
    http://expert.csdn.net/Expert/topic/2172/2172979.xml?temp=.3545191
    建议看一下