我需要搭建一个库,记录数大概的在10亿条左右,我现在要设计这个库的结构。
单靠索引的话,要在10亿条中找出一条记录也有点恐怖!
而且有了索引,数据的插入和删除我想也会很难处理,因为10亿条记录中每天大概有1000万条需要更新!
这个库该怎么搭,能不能给些建议??
另外问一下,有没有人了解c-tree???

解决方案 »

  1.   

    10亿条进行索引查找对oracle来说是小case(索引重复值少用非位图索引,重复值多用位图索引)。分区表+分区索引,一个最好分区不要超过5000万数据
      

  2.   

    对于ORCALE,10亿量级索引查找,性能应该是没有问题,但当如此大的数据量需要更新的时候,比如插入和删除,性能问题不得不考虑!
      

  3.   

    数据量大小并不是问题(oracle10G能支持几千个TB),关键是oracle定位你需要的数据所花费的I/O量。超大数据量的操作,肯定要用索引(无论update/delete/select),如果不用索引,你得忍受table full scan,这种情况下,分区/分表会提高速度,但是总不能分几万个区/表吧?索引的创建也值得研究,最好能创建unique index(primary key),index unique scan的效率是最高的。如果不能,创建的索引重复值要少(index range scan的效率也不错),例如在10亿记录的表中创建一个索引,其中索引值相同的记录达到100万,该索引的用处不大。为了需要,可以建多个复合索引,一个表拥有的索引的多少对oracle来说不是一个问题,不过如果一个列在多个复合索引中出现,你写sql的时候要小心,优化器可能不会选择你期望的索引,这时,你可以通过hint指定索引(你清楚你需要使用哪个索引):/* +index(table_name,index_name) */。oracle的非位图索引是B+树创建的,如果索引重复值不多,update/insert/delete也不会是一个问题。如果索引值重复的记录数量超过表记录10%以上,还不如不建,建了会有几个后果:
    1.select效率低:例如100条记录中取10条记录的index range scan将会有10*2次I/O操作,如果没有索引,table full scan也许1次I/O就能完成(跟db_file_multiblock_read_count参数有关)
    2.delete/insert效率低:B+树叶节点重复值多,hash运算耗时。
    3.update如果更新了索引字段,跟delete/insert的问题一样。
    一定要建,可以使用位图索引,对delete/insert/update不会造成影响。1000万条记录的更新如果在一个transaction中完成,要准备一个大的回滚段(9i AUM模式下,要准备一个大的undo tablespace),否则其它transaction无法得到回滚段而处于等待状态。如果你经常需要对表的很多数据进行查询、统计,不如将数据转移到一个OLAP Database中,为OLAP而建的oracle 一般db_block_size>=32K(OLTP一般为8K),db_file_multiblock_read_count>=64(OLTP一般为16),你的查询效率将大大提高以上为我个人观点,欢迎讨论
      

  4.   

    drabit(square),最后关于数据块大小的回答,我认为不一定转换为OLAP,oracle 9i可支持不同表空间采用不同的的数据块大小前面对索引的回答很对
      

  5.   

    感谢drabit(square) ,能够有如此专业的回答,我本人对oracle数据库不是很熟悉,我在开发一些测试代码来测试性能。
    欢迎大家讨论!
      

  6.   

    2000万条记录插入时间 4.5个小时,带index插入。
    我是在pc上面测试的,p4 2G 1G内存 7200转普通硬盘。
    不知道各位有没有这方面的经验???
    我准备测试产生2亿条记录,利用周末时间来测试,下周等我消息。
      

  7.   

    drabit(square)
    为了需要,可以建多个复合索引,一个表拥有的索引的多少对oracle来说不是一个问题不能同意这样的看法,索引太多的话数据库开销很大,尤其插入删除。
      

  8.   

    10亿条记录每天更新1000万,要是有多个索引,估计没多久索引所占的空间比表还大了,
    位图索引不行,根据ORACLE的文档,这是静态表用的,这里不合适
    用UNIQU索引,那位仁兄估计不熟悉分区表吧,这种大表千万别用
    这样试试看,看有没有标志静态的标志位的字段作为分区字段之一,这可以使静态数据与动态数据分开,这样再加上按天分区,分区多怕什么,怕的就是数据取不出来
      

  9.   

    因为10亿条记录中每天大概有1000万条需要更新!
    ------------------------------------------
    注意: 只有 1/100的数据需要更新楼主最好先把业务定好型(OLAP/OLTP),然后再设计数据库结构,
    因为OLAP,OLTP的数据库设计差别是很大的,一个对并发的性能要求
    很高,一个基本是静态查询,没有什么活跃的并发事务.分区表是肯定要用的,至于索引的规划,也没有统一的标准,只能自己
    根据业务数据去摸索.上面有人给出的这个结论如果对于OLTP系统是完全错误的:
      "一个表拥有的索引的多少对oracle来说不是一个问题"赞成 "静态数据和动态数据要分开",这是数据库物理设计的一项
    重要工作.
      

  10.   

    谢谢各位的参与,我现在正在积极的作各方面的测试。10亿条数据记录!对我目前的开发机器来说根本无法承受,真正的测试数据大家需要等待,我的机器还没有来!大家可以先讨论建议配置!我的数据很简单,只需要建立两个索引,这两个字段上的记录都有重复记录。我开发了一些程序作插入测试:
    当数据库中有1500万条记录时(包含一个索引),插入10万条新记录,最快完成时间3分钟。
    发现插入速度到后边越来越慢,开始库中不到100万条记录插入时,插入10万条只需要18秒!!!!
    加上事务处理的话会慢很多,以上两种情况完成时间分别是1分钟和8分20秒。对于如此大的
    数据量,我想我不考虑分表存储是不行啦...........痛苦中......以后开发的工作量会大n多!
    我的机器配置CPU:p4 2.0G MEM:1G DISK: ide7200
      

  11.   

    leecooper0918(爱一个人好难):
    请教一下,对于静态数据应该如何设计结构?有些什么原则或者方法?谢谢!
      

  12.   

    偶看过中国移动几个省营业帐务系统的设计,举个例子给楼主参考:
    500万用户 * 6条帐单/用户/月 * 12月/年 * 4年 = 15亿条
    4家不同厂商6个省的设计均采用分表设计(1种和多种):
    1 按年月分
    2 按10万号段分
    3 按城市分
    4 按分100万分
    5 按帐务ID范围分
    ..............当然这样做应用层可能麻烦一点哦
    各省移动营业帐务系统采用的都是顶极的商用UNIX服务器:
    IBM P690/HP SuperDome/SUN E12K等
    作为个人看法目前的数据库版本及主机环境:
    ORACLE8i/9i 如果单表数量超过5000万我肯定会显式分表的;
    至于表分区:超过100M必须分区
      

  13.   

    我自己的体会,在自己写测试程序向数据库中插入大量数据时,主要是慢在IO阻塞。程序刚开始运行时,速度很快,是因为都只是写在缓冲区里。缓冲区写满了,可还是不断地有新的数据需要插入,这时候就需要等IO了,硬盘狂转。这时CPU的idle也会很低。
    表大的话,还是用分区比较方便。对开发、调试、备份都有好处。
      

  14.   

    感觉测试程序应该大概模拟一下实际使用时的插入、删除频率和规律。如果只是一个简单的插入程序,执行速度是很快的,只要是不停地一直运行,再好的配置恐怕也吃不消。因为IO比CPU慢多了。缓冲区也只是在高峰时期把IO访问积攒下来,等到非高峰时期再进行。如果一直处于高峰期,缓冲区就根本起不到作用了。