Oracle-oracle大数据量性能优化

前端开发 前端开发 主题:1148 回复:2395

Oracle-oracle大数据量性能优化

灵芸 发布于 2017-03-16 字数 93 浏览 1414 回复 8

Oracle在处理大数据的查询时,为了提高其查询速度,除了增加索引,还有其他什么方法?分区?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(8

甜柠檬 2017-10-27 8 楼

你这个话题好笼统呀,优化除了设置适当的索引外,分区只是方便维护,根据你的环境及数据字典还可以考虑按某个参照来分区,比如时间日期分区、地区分区等;再者进行行或列分割、sql优化、hash分区优化等,给你推荐一篇文章:

Oracle查询优化4大方面的主要途径

偏爱自由 2017-08-08 7 楼

作为数据库管理员能做的就是分区,加索引。如果想进一步优化,可以:
1.配合代码将表拆分;
2.使用job or procedure提取数据到中间表,查询时从中间表查。
3.优化SQL(这个方法针对编写的比较垃圾的SQL还是比较有用的)
4.增加服务器性能。

浮生未歇 2017-07-13 6 楼

这个问题很大,要详细写的话,oracle的查询优化完全可以写一本书!以我的经验来说,对于大数据量的查询优化,除了前面两位朋友的回答外,我还有一点小小的补充,就是说有时候明明sql优化、索引、分区都搞好了,在测试环境都没有问题,但是到了生产环境就是不行,就是慢,这时,你就要对比两个环境的执行计划是否都是最优的,我曾遇到过这样的问题,在生产环境上,某个大型查询的执行计划,竟然没有用到其中一个表的主键,经过分析,对这个表进行了analyze操作,这才恢复正常;
oracle10G以后的版本,都有自动分析数据库对象的功能,但是这个自动化的功能,我感觉并不是百分之百保险,况且还会占用大量资源,所以,对于大数据量的查询,要综合考量各种因素,技术上的,非技术上的,各方面都要有所了解才行!

想挽留 2017-06-16 5 楼

个人总结一下sql优化,来提高查询速度:
1、 写查询语句时,要把查询的字段一一列出

查询时不要使用类似select * from x_table的语句,要尽量使用select id,name from x_table,以避免查询出不需要的数据浪费资源。对于海量数据而言,一个字段所占用的资源和查询时间是相当可观的。

2、 减少不必要的查询条件

当我们在做查询时,常常是前台提交一个查询表单到后台,后台解析这个表单,而后进行查询操作。在我们解析表单时,为了方便起见,常常喜欢将一些不需要查询的条件用永真的条件来代替(如:select count(id) from x_table where name like ‘%’),其实这样的SQL对资源的浪费是相当可怕的。我试过对于同样的近一千万条记录的查询来说,使用select count(id) from x_table 进行表查询需要11秒,而使用select count(id) from x_table where name like ‘%’却花了33秒。

3、 避免在查询时使用表连接

在做海量数据查询时,应尽量避免表连接(特别是左、右连接),万不得已要进行表连接时,被连接的另一张表数据量一定不能太大,若连接的另一张表也是数万条的话,那估计可以考虑重新设计库表了,因为那需要等待的时间决不是正常用户所能忍受的。

4、 嵌套查询时,尽可能地在第一次select就把查询范围缩到最小

在有多个select嵌套查询的时候,应尽量在最内层就把所要查询的范围缩到最小,能分页的先分页。很多时候,就是这样简单地把分页放到内层查询里,对查询效率来说能形成质的变化。

偏爱自由 2017-06-04 4 楼

首先,分区是个好方法。

另外,如果经常按照某个字段查询的话,可以对该字典使用聚簇方法。这样子会大大减小需要读取的block。

晚风撩人 2017-05-18 3 楼

数据库上:可以添加分区,增加索引,建立视图,增大缓冲区,将语句KEEP到共享池……
服务器硬件:增加CPU,增大内存,使用高速磁盘或者使用SSD……

清晨说ぺ晚安 2017-05-08 2 楼

这个问题很笼统,是对现有系统进行优化还是一个新的系统?如果是现有系统,只能通过索引,sql的优化来实现,如果是新的,就要从业务层面考虑数据库的设计,这样能从根本上解决效率.比如建立分库,合理的表结构,然后对表进行分区,建立有效的索引,注意sql的优化.

虐人心 2017-03-19 1 楼

1)最常见的调优方法是在数据库中增加索引,索引(index)是常见的数据库对象,充分利用索引来减少表扫描的 I/O 次数,使用索引可以避免不必要的大表全表扫描,索引设置的位置要视 where 子句中索引列所应用的查询条件而定,通过索引对表的数据进行检索比起直接全表扫描所引起的I/O操作要小得多,索引可增加查询速度;
2)若某种业务的数据量增长非常快,可以使用分区表技术将数据进行分散,将不同表空间分布到不同的磁盘当中,使得硬盘之间 I/O 负载均衡,在一定程度上缓解了数据量过大引起的负面影响,并且会缩短查询时间;
3)使用存储过程完成数据库中频繁执行的应用逻辑,使代码编程与数据库的操作分离,可以降低网络传输量,提高数据请求的执行效率,执行存储过程时,用户只需要发出执行命令,而不再进行SQL语句提交,节省了系统的SQL语法分析,充分利用了SQL共享池;
4)使用Oracle优化器执行直接提交的查询SQL 语句,可以大大提高语句的执行效率;
5)使用触发器自动执行的SQL语句,可以降低网络 I/O及系统资源的消耗,如需要对所有访问数据库的程序自动实施一定规则或检查,则使用触发器可以大大提高效率。
6)根据数据库运行状况重新调整SGA的大小,对每个节点修改SGA大小的方法如下:
  SQL>alter system set sga_target=200m scope =both sid=’RACDB1’;
  SQL>alter system set sga_target=200m scope =both sid=’RACDB2’;
7)调整 SQL 的关键是使数据库寻找数据的路径最简化,限制动态SQL的使用,优化操作符,如in或not in,is null 或 is not null,like ,union 等操作符,应尽量少用;
8)避免相关子查询,查询嵌套层次越多,效率越低,为了加速查询速度,可以使用临时表;