大数据时代让oracle跑的更快
2015-08-01 21:58
489 查看
大数据时代的来临不仅使得Hadoop、MangoDB等新技术横行,也对传统数据库如oracle产生了巨大的影响。为了应对海量的数据,oracle可以从以下几方面进行优化。
一.架构:
这里主要是使用集群技术,进行横向扩展,将一台数据库的负载分散到多台,从而提高数据库性能。
二.分区:
当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。一般情况下,一张表的数据超过2G,应该考虑使用分区。
表分区有以下优点:
1、改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
2、增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;
3、维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;
4、均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。
当然所谓提高查询性能是在没有索引或sql语句使用不到索引时,如果可以使用索引效果并不明显。另外在海量数据的条件下,表分区还便于我们进行数据管理,可以通过分区交换技术,将时间比较早的分区直接放到历史数据仓库中。
查询特定分区语句:
select count(*) from table_name partition (PART2007);
跨分区查询可以使用如下语句:
select sum( *) from
(select count(*) from table_name PARTITION (PART2007)
union all
select count(*) from table_name PARTITION (PART2008)
);
三.索引:
索引就像一本书的目录,可以帮我们快速定位一条数据。Oracle提供了三种索引:
1.B树索引(B-Tree index):适合于键值重复率低的场合,不适合于键值重复率高的场合。因为B树索引的存在,使我们在一张1亿条数据的表中查找一条数据和在一张1万条数据的表中查找一条数据所用的·时间差不多。
2.位图索引(Bitmap index):与B树索引正相反,适合于键值重复率高的场合,而不适合于键值重复率低的场合。位图索引更节省空间,对高重复率键值上的count、or、and等操作,性能良好。但不适合于键值重复率低的场合,而且不适合DML操作,对DML操作不仅效率低下,而且频繁操作还会造成阻塞。因此位图索引只适合OLAP型数据库,不适合OLTP型数据库。
3.全文索引(Text index):类似于搜索引擎的处理方式,在实际应用中不多。
四.并行:
并行处理的机制实际上就是把一个要扫描的数据集分成很多小数据集,Oracle会启动几个并行服务进程同时处理这些小数据集,最后将这些结果汇总,作为最终的处理结果返回给用户。这种数据并行处理方式在OLAP系统中非常有用,OLAP系统的表通常来说都是非常大,如果系统的CPU比较多,让所有的CPU共同来处理这些数据,效果就会比串行执行要高得多。
要使一个查询能够并行执行,可以通过以下方式:
1、SQL语句中有Hint提示,例如:select /*+ parallel(4) */ count(*) from test_a ;---指定一个并行度为4的并行查询。
2、SQL语句中引用的对象(表、索引、段等)被设置了并行属性。创建索引时使用并行方式在系统资源充足的时候会使性能得到很大的提高,特别是在OLAP系统上对一些很大的表创建索引时更是如此。
并行使用的条件:
1.CPU数量多,多CPU这是前提;
2.硬件资源配置高,I/O充足;
3.系统负载轻,并行会增加负载,如果此时负载已经很重,用并行只会更慢。
并行不仅可用于查询,还可以DDL、DML和SQL*LOADER。
五压缩:
压缩技术一般应用在“海量数据”的范畴,在大数据量下并且重复率高的情境下压缩的效果才好,适合于OLAP数据库不适合OLTP数据库,只要数据量达到一定程度的时候使用这门技术才有意义。数据块压缩原理与文件压缩原理差不多,是使用长度较短符号来代替列中的每个值,由于符号占用空间小于实际值,从而达到节约空间的效果,当列中重复值越多压缩效果越好。
压缩技术的好处:
1.节约空间:压缩技术的最大好处就是节约空间
2.减少memory/IO开销:当使用了压缩技术后,同等记录对应的数据块相对较少,自然而然IO开销就小了
3.提高数据处理效率:数据压缩后,扫描数据块变少了,导致逻辑I/O(LIO)减少(一致性读减少),同时有更多的数据块缓存到内存中,导致物理I/O(PIO)减少,当然CPU消耗自然也少了。
数据压缩不适合DML操作:
1.DML操作是有锁lock的(insert update delete),当更多的记录集中在更少的数据块中时,导致访问这个数据块的用户就多,就是产生争用和等待(数据块头部的事务槽ITL处理能力毕竟有限,大量事务操作必然造成阻塞),从而降低了效率。
2.数据插入、更新和索引键值更新时,都要先解压缩再更新,等待的时间会更长。
3.索引键值更新的时间也变长。
最后,分区表的每个分区都可以独立压缩,如果在表级设置压缩属性的话,那么所有分区都会启动压缩功能。
六SQL优化:
要使SQL高效,最核心的是减少数据块的访问,可从以下方面考虑:
1.尽可能重用结果集,即子查询的结果集被父查询直接使用,而不需要进行第二次查询。
2.正确使用索引,选择正确的索引类型(B树索引、位图索引),如果是分区表,查询范围在分区内时分区索引比全局全局索引快,查询范围跨分区时则反之。此外,要注意复合索引必须按照固定顺序查询才有效。
3.正确的执行计划。
七数据的加载和导出
1.数据加载可以使用sql*loader工具进行加载,它的性能高于insert语句。
2.sql*loader加载数据分为常规加载和直接加载,常规加载也是通过SGA区进行数据处理,会保证数据符合表的约束性要求。
3.直接加载,数据不是在SGA区完成的,没有其它资源的征用,直接写入数据文件,速度更快,但不会检查数据的合法性,即使不符合要求(如主键重复)也会写入数据库中。如果表中有非约束性索引,直接加载完毕后会维护索引的完整性,但如果有约束性索引,则加载后会将索引置为UNUSABLE。
4.sql*loader无论是常规加载还是直接加载,都可以通过指定参数来使用并行的方式。
5.数据导出可以通过spool命令进行。
一.架构:
这里主要是使用集群技术,进行横向扩展,将一台数据库的负载分散到多台,从而提高数据库性能。
二.分区:
当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。一般情况下,一张表的数据超过2G,应该考虑使用分区。
表分区有以下优点:
1、改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
2、增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;
3、维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;
4、均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。
当然所谓提高查询性能是在没有索引或sql语句使用不到索引时,如果可以使用索引效果并不明显。另外在海量数据的条件下,表分区还便于我们进行数据管理,可以通过分区交换技术,将时间比较早的分区直接放到历史数据仓库中。
查询特定分区语句:
select count(*) from table_name partition (PART2007);
跨分区查询可以使用如下语句:
select sum( *) from
(select count(*) from table_name PARTITION (PART2007)
union all
select count(*) from table_name PARTITION (PART2008)
);
三.索引:
索引就像一本书的目录,可以帮我们快速定位一条数据。Oracle提供了三种索引:
1.B树索引(B-Tree index):适合于键值重复率低的场合,不适合于键值重复率高的场合。因为B树索引的存在,使我们在一张1亿条数据的表中查找一条数据和在一张1万条数据的表中查找一条数据所用的·时间差不多。
2.位图索引(Bitmap index):与B树索引正相反,适合于键值重复率高的场合,而不适合于键值重复率低的场合。位图索引更节省空间,对高重复率键值上的count、or、and等操作,性能良好。但不适合于键值重复率低的场合,而且不适合DML操作,对DML操作不仅效率低下,而且频繁操作还会造成阻塞。因此位图索引只适合OLAP型数据库,不适合OLTP型数据库。
3.全文索引(Text index):类似于搜索引擎的处理方式,在实际应用中不多。
四.并行:
并行处理的机制实际上就是把一个要扫描的数据集分成很多小数据集,Oracle会启动几个并行服务进程同时处理这些小数据集,最后将这些结果汇总,作为最终的处理结果返回给用户。这种数据并行处理方式在OLAP系统中非常有用,OLAP系统的表通常来说都是非常大,如果系统的CPU比较多,让所有的CPU共同来处理这些数据,效果就会比串行执行要高得多。
要使一个查询能够并行执行,可以通过以下方式:
1、SQL语句中有Hint提示,例如:select /*+ parallel(4) */ count(*) from test_a ;---指定一个并行度为4的并行查询。
2、SQL语句中引用的对象(表、索引、段等)被设置了并行属性。创建索引时使用并行方式在系统资源充足的时候会使性能得到很大的提高,特别是在OLAP系统上对一些很大的表创建索引时更是如此。
并行使用的条件:
1.CPU数量多,多CPU这是前提;
2.硬件资源配置高,I/O充足;
3.系统负载轻,并行会增加负载,如果此时负载已经很重,用并行只会更慢。
并行不仅可用于查询,还可以DDL、DML和SQL*LOADER。
五压缩:
压缩技术一般应用在“海量数据”的范畴,在大数据量下并且重复率高的情境下压缩的效果才好,适合于OLAP数据库不适合OLTP数据库,只要数据量达到一定程度的时候使用这门技术才有意义。数据块压缩原理与文件压缩原理差不多,是使用长度较短符号来代替列中的每个值,由于符号占用空间小于实际值,从而达到节约空间的效果,当列中重复值越多压缩效果越好。
压缩技术的好处:
1.节约空间:压缩技术的最大好处就是节约空间
2.减少memory/IO开销:当使用了压缩技术后,同等记录对应的数据块相对较少,自然而然IO开销就小了
3.提高数据处理效率:数据压缩后,扫描数据块变少了,导致逻辑I/O(LIO)减少(一致性读减少),同时有更多的数据块缓存到内存中,导致物理I/O(PIO)减少,当然CPU消耗自然也少了。
数据压缩不适合DML操作:
1.DML操作是有锁lock的(insert update delete),当更多的记录集中在更少的数据块中时,导致访问这个数据块的用户就多,就是产生争用和等待(数据块头部的事务槽ITL处理能力毕竟有限,大量事务操作必然造成阻塞),从而降低了效率。
2.数据插入、更新和索引键值更新时,都要先解压缩再更新,等待的时间会更长。
3.索引键值更新的时间也变长。
最后,分区表的每个分区都可以独立压缩,如果在表级设置压缩属性的话,那么所有分区都会启动压缩功能。
六SQL优化:
要使SQL高效,最核心的是减少数据块的访问,可从以下方面考虑:
1.尽可能重用结果集,即子查询的结果集被父查询直接使用,而不需要进行第二次查询。
2.正确使用索引,选择正确的索引类型(B树索引、位图索引),如果是分区表,查询范围在分区内时分区索引比全局全局索引快,查询范围跨分区时则反之。此外,要注意复合索引必须按照固定顺序查询才有效。
3.正确的执行计划。
七数据的加载和导出
1.数据加载可以使用sql*loader工具进行加载,它的性能高于insert语句。
2.sql*loader加载数据分为常规加载和直接加载,常规加载也是通过SGA区进行数据处理,会保证数据符合表的约束性要求。
3.直接加载,数据不是在SGA区完成的,没有其它资源的征用,直接写入数据文件,速度更快,但不会检查数据的合法性,即使不符合要求(如主键重复)也会写入数据库中。如果表中有非约束性索引,直接加载完毕后会维护索引的完整性,但如果有约束性索引,则加载后会将索引置为UNUSABLE。
4.sql*loader无论是常规加载还是直接加载,都可以通过指定参数来使用并行的方式。
5.数据导出可以通过spool命令进行。
相关文章推荐
- Oracle 学习之RMAN(十四)恢复实战--基于时间点恢复
- JDBC
- oracle 索引原理
- Linux x64系统上安装 oracle 11g R2 x64
- Oracle数据库软件标准版的一个限制:只能用一个rman channel
- Oracle常见函数的部分解释与示例
- [转]oracle 12c 中的分页子句
- ORACLE 中split功能 & 包
- oracle 12c 中scott账户与表问题
- ORACLE之打补丁
- Oracle之DataGurd(DG)环境升级--模式切换
- Oracle之DataGurd(DG)环境升级--快捷同步
- 盘点那些年,被Oracle收购的公司
- 盘点那些年,被Oracle收购的公司
- ORACLE坏块总结
- MinGW + OCILib 访问Oracle数据库
- Oracle 树操作(select…start with…connect by…prior)
- oracle-type
- oracle-循环
- oracle-if