ORACLE中大数据量下索引效率的测试与分析(一)
2009-02-25 09:56
411 查看
摘要:通过模拟海量数据的产生,生成测试数据并进行数据查询、插入,对索引的效率进行分析,给出了Oracle数据库中大数据量下如何合理使用全局索引与分区索引的建议。
关键词:大数据量;索引;效率;分区
0 引言
一些大的应用系统如医保、移动、银行等行业的应用系统,出于节约管理成本、提高数据共享度等方面的考虑,业务数据一般以省为单位集中,数据库中存放的数据量很大(一般为T级),而这类业务系统一般是OLTP系统,每个业务所操作的数据量相对较小,因此业务实现时能否使用索引、索引是否高效等就成为需要解决的问题。为充分了解数据库在大数据量下的性能和工作负载,对数据库的索引效率进行测试和分析,指导系统设计和开发非常有必要。
我们以某部门基于Oracle数据库的J2EE架构的应用系统为例,对Oracle数据库产品进行了测试。测试与分析的步骤如下:
(1)生成模拟数据并进行查询测试;
(2)分析索引对数据插入的影响;
(3)分析索引对数据查询的影响;
(4)结论与建议。
1 生成模拟数据与查询测试
1.1测试目的
根据对业务数据的估算,系统中用户数将达到2000万,数据库中要保留三年的业务数据,最大的业务表中的数据量大致在30亿条,因此测试前先模拟出2000万用户3年的数据。我们希望通过对这张表的实际操作来确定大数据量表的设计原则,即:
(1)对大表是采用Oracle分区特性,还是每个业务单独建立一张物理表;
(2)索引的建立原则是建立分区索引还是建立全局索引;
(3)如果使用分区,分区策略是先按时间分区还是先按业务单位分区。
1.2测试环境
一台IBM P570(4CPU/16G内存),磁盘阵列为IBM4500。Oracle数据库版本为10.2.0.2,操作系统版本为AIX 5.3。Oracle SGA的大小为6000M。数据表空间和索引表空间的数据块大小均为8K。
1.3测试步骤
生成模拟数据采取以下步骤进行:
(1)以某地—个表05年12月份数据为基础,保存为种子表DATA_SEED(Custld,Feym,Acptld,Custldl,hsUnit,Dept,Unit)。表中共有17万用户的47万条数据。
(2)建立分区表DATA_DEST,结构与DATA_SEED相同。并对列CustId建立全局索引GLO_DATA_DEST及分区索引LOC_DATA_DEST(因同一列不允许建两个索引,需加字段Custldl,值等于CustId并对其建立分区索引)。
(3)复制DATA_SEED达到每月2000万用户产生的数据量。为保证数据真实的离散度,对索引列每次复制都用升位的方式处理,索引列前4位为单位码,从0001开始,每次加1。
(4)修改分区列Feym为次月(如200601),以同样的方式复制产生次月数据,以此类推得到3年历史数据。
(5)插入完06年数据后就删除Custld上的全局索引,插入完2007年的数据后就删除该表上的所有索引。
这种方式获取的数据与实际的数据产生情况比较接近,即索引是预先建好的,在插入数据的过程中,自动维护索引。索引字段Custld和Acptld的离散度也和实际情况相符。
1.4实际测试结果
生成模拟数据总共耗时178,378秒。插入每个月的数据时所耗时间见表1。
存在三个索引(custId字段上的全局索引,ACPTID,Cusddl上的分区索引)时插入数据的耗时情况参见表1:
表1 存在三个索引时插入数据的耗时
删除Custld字段上的全局索引,保留Acptld,Cusfidl上的分区索引,再进行数据插入耗时情况参见表2:
表2 仅存在分区索引时插入数据的耗时
删除该表上所有三个索引后,再进行数据插入的耗时情况参见表3:
表3 不存在索引时插入数据的耗时
2 索引对数据插入的影响
(1)存在全局索引,数据插入的时间随分区数的增加而增加
从表1中可以看出,在2006年1月至2006年12月期间,存在CustId的全局索引,随着数据量的增长,每新增一个月的数据,耗时需要多增加1000秒左右。从表2中可以看出,在删除了CustId的全局索引后(此时还存在CustIdl及Acptld的分区索引)每次插入数据的时间维持在3000秒左右。
(2)索引的存在会影响数据插入的速度
从表3中可以看出,没有索引时每个分区插入的时间为1200秒左右,比存在索引时插入的速度快一倍多。这说明并非索引越多性能越好,是否建立列索引需根据具体应用决定。
(3)如果被索引的列的值与原来的数据相同,会影响插入的性能
插入第二个月的数据时,对于B树索引,不同月份同一CustId的索引数据存放在一起,这需要更多的资源去维护索引,索引空间不够时,还需分裂索引块。此时全局索引的表现比分区索引明显得多,因为全局索引中,被索引列中相同的值的重复率会比分区索引高很多。
关键词:大数据量;索引;效率;分区
0 引言
一些大的应用系统如医保、移动、银行等行业的应用系统,出于节约管理成本、提高数据共享度等方面的考虑,业务数据一般以省为单位集中,数据库中存放的数据量很大(一般为T级),而这类业务系统一般是OLTP系统,每个业务所操作的数据量相对较小,因此业务实现时能否使用索引、索引是否高效等就成为需要解决的问题。为充分了解数据库在大数据量下的性能和工作负载,对数据库的索引效率进行测试和分析,指导系统设计和开发非常有必要。
我们以某部门基于Oracle数据库的J2EE架构的应用系统为例,对Oracle数据库产品进行了测试。测试与分析的步骤如下:
(1)生成模拟数据并进行查询测试;
(2)分析索引对数据插入的影响;
(3)分析索引对数据查询的影响;
(4)结论与建议。
1 生成模拟数据与查询测试
1.1测试目的
根据对业务数据的估算,系统中用户数将达到2000万,数据库中要保留三年的业务数据,最大的业务表中的数据量大致在30亿条,因此测试前先模拟出2000万用户3年的数据。我们希望通过对这张表的实际操作来确定大数据量表的设计原则,即:
(1)对大表是采用Oracle分区特性,还是每个业务单独建立一张物理表;
(2)索引的建立原则是建立分区索引还是建立全局索引;
(3)如果使用分区,分区策略是先按时间分区还是先按业务单位分区。
1.2测试环境
一台IBM P570(4CPU/16G内存),磁盘阵列为IBM4500。Oracle数据库版本为10.2.0.2,操作系统版本为AIX 5.3。Oracle SGA的大小为6000M。数据表空间和索引表空间的数据块大小均为8K。
1.3测试步骤
生成模拟数据采取以下步骤进行:
(1)以某地—个表05年12月份数据为基础,保存为种子表DATA_SEED(Custld,Feym,Acptld,Custldl,hsUnit,Dept,Unit)。表中共有17万用户的47万条数据。
(2)建立分区表DATA_DEST,结构与DATA_SEED相同。并对列CustId建立全局索引GLO_DATA_DEST及分区索引LOC_DATA_DEST(因同一列不允许建两个索引,需加字段Custldl,值等于CustId并对其建立分区索引)。
(3)复制DATA_SEED达到每月2000万用户产生的数据量。为保证数据真实的离散度,对索引列每次复制都用升位的方式处理,索引列前4位为单位码,从0001开始,每次加1。
(4)修改分区列Feym为次月(如200601),以同样的方式复制产生次月数据,以此类推得到3年历史数据。
(5)插入完06年数据后就删除Custld上的全局索引,插入完2007年的数据后就删除该表上的所有索引。
这种方式获取的数据与实际的数据产生情况比较接近,即索引是预先建好的,在插入数据的过程中,自动维护索引。索引字段Custld和Acptld的离散度也和实际情况相符。
1.4实际测试结果
生成模拟数据总共耗时178,378秒。插入每个月的数据时所耗时间见表1。
存在三个索引(custId字段上的全局索引,ACPTID,Cusddl上的分区索引)时插入数据的耗时情况参见表1:
表1 存在三个索引时插入数据的耗时
删除Custld字段上的全局索引,保留Acptld,Cusfidl上的分区索引,再进行数据插入耗时情况参见表2:
表2 仅存在分区索引时插入数据的耗时
删除该表上所有三个索引后,再进行数据插入的耗时情况参见表3:
表3 不存在索引时插入数据的耗时
2 索引对数据插入的影响
(1)存在全局索引,数据插入的时间随分区数的增加而增加
从表1中可以看出,在2006年1月至2006年12月期间,存在CustId的全局索引,随着数据量的增长,每新增一个月的数据,耗时需要多增加1000秒左右。从表2中可以看出,在删除了CustId的全局索引后(此时还存在CustIdl及Acptld的分区索引)每次插入数据的时间维持在3000秒左右。
(2)索引的存在会影响数据插入的速度
从表3中可以看出,没有索引时每个分区插入的时间为1200秒左右,比存在索引时插入的速度快一倍多。这说明并非索引越多性能越好,是否建立列索引需根据具体应用决定。
(3)如果被索引的列的值与原来的数据相同,会影响插入的性能
插入第二个月的数据时,对于B树索引,不同月份同一CustId的索引数据存放在一起,这需要更多的资源去维护索引,索引空间不够时,还需分裂索引块。此时全局索引的表现比分区索引明显得多,因为全局索引中,被索引列中相同的值的重复率会比分区索引高很多。
相关文章推荐
- ORACLE中大数据量下索引效率的测试与分析(二)
- 测试环境运行正常的SQL到生产上奇慢无比,最终导致UI访问超时;确定SQL效率无问题,那么就极有可能使生产环境的表数据量较大而且没有做分析。
- 基于Python的数据分析:数据库索引效率探究
- 【原创】oracle中大数据量更新的测试
- 运用PARALLEL方式成倍提升Oracle数据分析效率
- 为什么我的ArcSDE数据重建索引和分析(Analye)后反而效率更慢
- mongoDB批量插入数据性能分析、索引效率
- oracle 性能优化操作七:索引提高数据分布不均匀时查询效率
- 对Oracle中索引叶块分裂而引起延迟情况的测试和分析
- 对Oracle中索引叶块分裂而引起延迟情况的测试和分析
- 分析Oracle有时会用索引来查找数据的原因-oracle执行计划
- Oracle性能分析6:数据访问方式之索引扫描
- oracle 性能优化操作七:索引提高数据分布不均匀时查询效率
- 运用PARALLEL方式成倍提升Oracle数据分析效率
- oracle采用分区表+字段索引测试存储大量数据
- Oracle性能分析5:数据访问方式之索引结构和扫描方式介绍
- oracle 测试 清除分区数据,索引释放空间
- 数据压缩实验三:用c语言实现Huffman编码和压缩效率分析
- SQL SERVER 插入大批量数据有无索引的效率对比
- oracle 中的视图,索引,序列及同义词数据字典