我有pro*c写的程序,从oracle中取数据处理后再写回到库中,用update更新时每一千条得花近一个小时,这也太慢了,这是什么原因呢?怎么解决啊?着急中...
EXEC SQL UPDATE t_book_back_base SET BOOK_NAME=:BOOK_NAME,BOOK_SUB_NAME=:BOOK_SUB_NAME,SERIES_NAME=:SERIES_NAME,AUTH_NAME=:AUTH_NAME,PUB_NAME=:PNAME,PUB_ID=:PUB_ID
WHERE BOOK_ID=:BOOK_ID;
以上这些变量如:BOOK_NAME等都是数组,有1000维。

解决方案 »

  1.   

    谢谢回复!!!
    update一条时也很费时,不知是什么原因?
    表中也没有建索引,我试着把book_id建一索引速度依旧很慢!太急人了!!!
    还请指教!
      

  2.   

    我觉得你的数据类型选择不对
    为什么不采用简单类型呢?此外,要经常COMMIT,把回滚段设置得大一点。
      

  3.   

    看看
    select * from t_book_back_base 
     WHERE BOOK_ID=:BOOK_ID
    这个sql的执行计划,这个sql的执行时间
      

  4.   

    这些数组都是如char BOOK_NAME[1000][128];这样的数据类型不对吗?简单类型是什么样的呢?
    不好意思,我是数据库的新手,还请大家多指教!
      

  5.   

    通过plsql 或者 sqlplus 或者其他工具设置跟踪和计时:
      set autot on ;
      set timing on ;
      然后执行一句更新语句:
      UPDATE t_book_back_base SET BOOK_NAME = &BOOK_NAME, BOOK_SUB_NAME = &BOOK_SUB_NAME, SERIES_NAME = &SERIES_NAME, AUTH_NAME = &AUTH_NAME, PUB_NAME = &PNAME, PUB_ID = &PUB_ID
    WHERE BOOK_ID = &BOOK_ID;
    看执行计划和执行时间,确定是否调用建立在book_id 上的索引,如果一条语句更新的速度比较快,那么可以确定更新语句没有问题;
      

  6.   

    char BOOK_NAME[1000][128];LZ打算把什么内容更新到数据库中呢?每条记录的每个字段里边塞1000*128的记录么?
    要是只有一个字符串  为什么不用BOOK_NAME[1000]呢
    你打开预编译过的.c文件 应该是类似下面吧:
    sqlstm.sqhstv[0] = (         void  *)&BOOK_NAME;
      sqlstm.sqhstl[0] = (unsigned int  )128002;
      sqlstm.sqhsts[0] = (         int  )0;
      sqlstm.sqindv[0] = (         void  *)0;
      sqlstm.sqinds[0] = (         int  )0;
      sqlstm.sqharm[0] = (unsigned int  )0;
      sqlstm.sqadto[0] = (unsigned short )0;
      sqlstm.sqtdso[0] = (unsigned short )0;
      

  7.   

    或者
    EXEC SQL UPDATE t_book_back_base SET BOOK_NAME=:BOOK_NAME[1]
      

  8.   

    我是想一次更新1000行,BOOK_NAME[1000][128]等是保存了1000个128字符长的字符串,而BOOK_ID[1000]中有1000个唯一的id号,这样BOOK_ID[1]的行对应的列BOOK_NAME更新为BOOK_NAME[1][128];查询时的时间很短,只是这条更新语句执行时间太长,更新这1000行得50多分钟。
    真郁闷!HELP!!!