大概每分钟会产生1-10w条数据,每条数据大概100字段,都是vchar(20)类型。
对这些数据,我需要执行50个select来过滤、归并然后把过滤、归并的结果,(每个select结果只会有1条数据),insert到相应的50个表中。不知道怎么做效率能高点。
我现在的想法用sqlloader每分钟把1-10w条数据导入临时表,然后做select和insert操作,操作完后truncate临时表。但我不知道sqlloader是否能支持这么频繁的交换。或者有什么更好的方法?
也不知道做50个select和50个insert操作会有多少i/o。有没有更好的办法?
还不知道truncate临时表和用内存表哪个效率更好点。有没有更好的办法?
如果都不行的话。只能在内存中做过滤和归并了。然后直接做insert操作!55希望得到大家的帮助啊!谢谢啊

解决方案 »

  1.   

    这么大的对象级别的并发,首先你要防止的就是热块问题.因此block最好是尽量的小,pctfree 设置大一点.分区是少不了,有可能的话需要做复合分区.
    为什么想用临时表呢?也许你所说的临时表不是真正意义上的temporary table吧.因为如果用session级别的话,那么你的数据一进去,会话结束就没了.如果是事物级的话,那就不用说了.
      

  2.   

    先在OS级别把源文件应该过滤的数据过掉一部份再进行IMPORT
      

  3.   

    对oracle db来说每分钟用sqlloader导入5-30w条的数据,然后对这些数据进行50个select操作(每个select返回1个结果),把select结果分别insert到50个表!
    这样的操作很吃力吗?
      

  4.   

    据我所知,临时表的数据是session级隔离的,不大确定同一个session是否可以既使用sqlldr,又可以调用存储过程或执行sql语句。
    如果是永久表的话,使用nologging属性较好。
    假如50个表的数据源都是同一张表,用insert all select是比较节省资源的。
      

  5.   


    每分钟产生1-10w条件数据,而且第每数据是100字段,我认为这个表负载太大了,简直是海量数据;
    你可以直接产生数据到50个表中,这样你就省了50个select来过滤、归并的操作,而且这样做数据分布到多个表,查询起来会快很;
    直接去掉那个大表,直接产生数据到50个小表里
      

  6.   


    我说的临时表不是temporary table的意思啊!是想用sqlloader倒入一张表永久表,临时存放每分钟的数据。用于统计。然后这分钟的数据统计完毕,就把统计结果放入不同的结果表,然后就删除这个临时表里面的内容。否则每分钟几十万数据这个表就会太大!
      

  7.   

    就是想用数据库的统计整理功能!所以每分钟都把数据导入数据库bigtemp表。然后整理将结果放入50个小表。然后再将bigtemp表删除,然后再将下一分钟的数据导入bigtemp表,然后整理将结果放入50个小表。这样循环.每个小表都会有该主题该分钟的统计结果,一天也就1440条数据,前台最终用这个50个小表的数据生成不同的报表!
    现在就是想优化[
    每分钟都把数据sqlloader到数据库bigtemp表。然后select bigtemp有50个select(每个select只有1个结果)
     将结果insert到50个小表]
    这个操作
      

  8.   

    sqlldr如果并行也可以,但是segments会比原来大得多,可能成倍的增加.看你的并行度了.这样会很快,但是对于空间要求比较大.所以你要考虑好了.
      

  9.   

    我把 sqlloader到tempTable 和 50个select 50个insert 和 truncate tempTable 封到1个oracle的作业里面是不是效率更高啊?这个我没太看明白我是开发人员所以对db不是特别熟悉
    不知道 ---,但是segments会比原来大得多,可能成倍的增加.看你的并行度了. --这样会很快,但是对于空间要求比较大. 
    这两句是什么意思啊
      

  10.   

    因为sqlldr如果使用并行的话,会同时开辟多个hwm下面的空间,这样就造成了segments的空间的浪费.比如,如果你使用串行sqlldr加载的话,表为1GB,但是使用并行,表就有可能达到1.5G的大小
      

  11.   

    "我需要执行50个select来过滤、归并然后把过滤、归并的结果"1-10W 请问数据是在哪里来的?文件还是数据库?"我需要执行50个select来过滤、归并然后把过滤、归并的结果,(每个select结果只会有1条数据),insert到相应的50个表中。 "我的理解你对这些数据自需要插入到数据库中的只有50条,是这个意思吗?按我的理解,你主要就是对这1-10W的数据进行分析,可以考虑使用程序过滤一些,或者使用内存数据库一类的.如果要保留 那1-10w的数据的话,可以考虑积攒到一定量 直接用sqlloader进去.不知道我理解的对吗?
      

  12.   

    50个INSERT不算很多,我用SQLLOADER处理30W条数据只用了10秒钟
      

  13.   

    至于你的那50个INSERT,是否可以考虑再你的零时表上建立一个触发器来完成呢?
      

  14.   

    不如使用materialized view自動每分鐘同步50個sql statment