我需要搭建一个库,记录数大概的在10亿条左右,我现在要设计这个库的结构。
单靠索引的话,要在10亿条中找出一条记录也有点恐怖!
而且有了索引,数据的插入和删除我想也会很难处理,因为10亿条记录中每天大概有1000万条需要更新!
这个库该怎么搭,能不能给些建议??
另外问一下,有没有人了解c-tree???
单靠索引的话,要在10亿条中找出一条记录也有点恐怖!
而且有了索引,数据的插入和删除我想也会很难处理,因为10亿条记录中每天大概有1000万条需要更新!
这个库该怎么搭,能不能给些建议??
另外问一下,有没有人了解c-tree???
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),你的查询效率将大大提高以上为我个人观点,欢迎讨论
欢迎大家讨论!
我是在pc上面测试的,p4 2G 1G内存 7200转普通硬盘。
不知道各位有没有这方面的经验???
我准备测试产生2亿条记录,利用周末时间来测试,下周等我消息。
为了需要,可以建多个复合索引,一个表拥有的索引的多少对oracle来说不是一个问题不能同意这样的看法,索引太多的话数据库开销很大,尤其插入删除。
位图索引不行,根据ORACLE的文档,这是静态表用的,这里不合适
用UNIQU索引,那位仁兄估计不熟悉分区表吧,这种大表千万别用
这样试试看,看有没有标志静态的标志位的字段作为分区字段之一,这可以使静态数据与动态数据分开,这样再加上按天分区,分区多怕什么,怕的就是数据取不出来
------------------------------------------
注意: 只有 1/100的数据需要更新楼主最好先把业务定好型(OLAP/OLTP),然后再设计数据库结构,
因为OLAP,OLTP的数据库设计差别是很大的,一个对并发的性能要求
很高,一个基本是静态查询,没有什么活跃的并发事务.分区表是肯定要用的,至于索引的规划,也没有统一的标准,只能自己
根据业务数据去摸索.上面有人给出的这个结论如果对于OLTP系统是完全错误的:
"一个表拥有的索引的多少对oracle来说不是一个问题"赞成 "静态数据和动态数据要分开",这是数据库物理设计的一项
重要工作.
当数据库中有1500万条记录时(包含一个索引),插入10万条新记录,最快完成时间3分钟。
发现插入速度到后边越来越慢,开始库中不到100万条记录插入时,插入10万条只需要18秒!!!!
加上事务处理的话会慢很多,以上两种情况完成时间分别是1分钟和8分20秒。对于如此大的
数据量,我想我不考虑分表存储是不行啦...........痛苦中......以后开发的工作量会大n多!
我的机器配置CPU:p4 2.0G MEM:1G DISK: ide7200
请教一下,对于静态数据应该如何设计结构?有些什么原则或者方法?谢谢!
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必须分区
表大的话,还是用分区比较方便。对开发、调试、备份都有好处。