本人菜鸟第一次提问,可能问题描述会不太清楚,请各位大牛谅解。 PL/SQL运行如下代码,要求是根据字段CC下同一字符串进行编码,29.5万条数据,第一次跑了30分钟我停止了,第二次跑了70多分钟还没结束还是停止了 后面PL/SQL就报ora03113 通信通道的文件结束,说是归档日志已经满了。按照网上的教程给修改了,但我还是想弄清楚这条语句到底有什么问题。
update LCA_编码 t set t.dlbh=(select a.BH from (select objectid,row_number() over(partition by CC order by CC) as BH from LCA_编码) a where a.objectid=t.objectid)

解决方案 »

  1.   

    你的具体需求是什么,描述清楚一些~
    另外,如果是本地数据库的话,建议关闭归档模式,方式如下:
    SQL> shutdown immediate;
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    SQL> startup mount;
    ORACLE instance started.Total System Global Area 3423965184 bytes
    Fixed Size                  2180544 bytes
    Variable Size            2013268544 bytes
    Database Buffers         1392508928 bytes
    Redo Buffers               16007168 bytes
    Database mounted.
    SQL> alter database noarchivelog;Database altered.SQL> archive log list;
    Database log mode              No Archive Mode
    Automatic archival             Disabled
    Archive destination            USE_DB_RECOVERY_FILE_DEST
    Oldest online log sequence     228
    Current log sequence           230
    SQL>
      

  2.   

    TLBH为nvarchar(255),根据CC的类型编码排序 用的是OVER(partion by order by),PL/SQL60多条记录很快就运行完了,但是运行29.5万条记录,PL/SQL运行了70多分钟还没有结束。之前做过对27.5万条记录的表格的CC字段赋空处理,oracle只要27S,同样用python要1分2S,而python同样处理29.5W条数据才1分7S,我觉得oracle性能应该比python优越,不知道出什么情况一直运行不停止。我这样您能看明白么
    CC TLBH
    SS  00001
    SS  00002
    AA  00001
    AA  00002
    BB  00001
    BB  00002
    BB  00003  
      

  3.   

    如果少数几条数据速度很快,而数据量一大则会变得异常慢,就要考虑一下你的SQL语句是不是对了打个比方说是不是有可能在子查询中形成了卡笛尔积,导致数据量成几十倍的增加归档日志的话,要是你确认库没问题一个你可以关闭归档,一个可以将日志备份到别的地方
      

  4.   

    为什么要UPDATE,直接CREATE TABLE AS 然后把老表干掉,新表重命名不就可以了
      

  5.   

    objectid有索引没,可以尝试在这列上建索引。
      

  6.   

    有考虑这是笛卡尔积的问题,但具体机制希望一个大牛来解释一下。create table的话会另外生产一个新表,我尝试过merge into,但不符合我的本意,这只是其中一个小功能,如果能原表更新最好了,我是关联几个字段批量更新
      

  7.   

    What does the execution plan say?
      

  8.   

    objectid换成rowid试试,不过效果估计不会太明显,全表更新并且时间都耗在了编号bh的生成上了。
      

  9.   

    弄个过程,   select a.BH from (select objectid,row_number() over(partition by CC order by CC) as BH from LCA_编码
    把这个sql的结果一条一条的  update就行了。
    29万数据开窗排序也需要个3,4秒的样子吧, 你每条记录搞一次, oracle怎么受得了。
      

  10.   

    这个语句放在SQLserver里面跑 29.5W条记录 2秒就全部更新了 是Oracle和SQLserver机制的问题么 还是说我写的语句在PLSQL里面不行