俺在试手小例子, 就是把股票行情的数据全导入oracle中,  
表中字段,
NO: 代码
DATES: 日期
OPEN: 开盘价
MAX: 最高价
MIN:最低价
CLOSE:收盘价YES:昨天的收盘价,(为了好做分析, 加了这个字段)现在的问题是, 数据文件中只有最前面的几个字段, 而没有我那个YES字段的值,所以都是空的
当然了, 这个值也就等于它前面一条记录的CLOSE的值,
因为不知道怎么发图, 这样说可能说不清楚, 发图很直观了
请教下, 这里有没SQL写或者其它什么的, 可以直接更新最后那个字段的?数据文件是几千个文本文件,400多万条记录吧
我用的JDBC做, 读取文件再插入数据库中, 试了好几次, 现在的时间也差不多半个钟左右
用HIBERNATE,试了几次,都没成功, 到100万条左右就出错了, 时间也超长,
这里有没可以再优化的呢

解决方案 »

  1.   

    --在no上增加索引
    UPDATE stock_data t
       SET t.yes =
           (SELECT p_close
              FROM (SELECT no,
                           lag(CLOSE) over(PARTITION BY no ORDER BY dates) p_close
                      FROM stock_data) a
             WHERE a.no = t.no);
      

  2.   

    http://hi.baidu.com/loveyurui/blog/item/36b040360fe96b58241f14cf.html
      

  3.   

    用JDBC或HIBERNATE直接把文本文件导入到数据库后,再把数据解析出来,批量插入数据,这样会比较。从你的要求来看,这种操作是一次性导入数据,所以纯用JAVA不划算。
      

  4.   

    回复:tangren
    看了你给的, 我去学习了LAG函数,觉得还是LEAD适合,它先按no分组,再按 dates排序
    以下是我写的,update stock s set s.yes = (select tyes from (
    select t.id tid, 
           lead(t.close,1, t.open) over(partition by t.no order by t.dates asc) tyes
    from stock t ) a
     where s.id=a.tid)只是, 问题是, 这个时间超长, 我昨晚放那让它执行, 早上出门前, 还有执行,
    7个多小时过去了, 还没完,我有试过, 先只执行1小段, 就加 where s.id<10, 这里都至少10分钟过去了, 也没完,
    我只执行这里
    select t.id tid,
           lead(t.close,1, t.open) over(partition by t.no order by t.dates asc) tyes
    from stock t
    也是好久没出结果,
    我有加NO索引, 甚至close, dates也都有加, 可还是这么慢,
    还有没提示效率的呢,
      

  5.   

    完工, 结贴, 如果还有效率提升的, 请提出来, 呵呵,用JDBC做,update stock s set s.yes = (select tyes from (
        select t.id tid, 
        lead(t.close,1, t.open) over(partition by t.no order by t.dates desc) tyes 
        from stock t where t.id between ? and ?) a 
        where s.id=a.tid) where s.id=?自我总结, 重点后面一句where s.id=?, 和中间的where t.id between ? and ?, 在这里卡了好久采用for循环, 刚办公室电脑上测试下了, 大概一秒钟能更新一万条, 哎, 家里的电脑, 执行了30多个小时, 还没完,
    这下就好了, 呵呵,