Oracle全表扫描性能优化之我见---应对海量数据库

Select * From myTable

大家看到这个语句感觉怎么样?

假如这个表很大而且必须要返回表里的所有数据,这时候我们再看这个语句是不是有点怕?

而这样的SQL语句在我们开发系统的时候经常碰到,特别是B/S架构的系统,一下子返回一万条数据确实有点恐怖。但是没有办法,既然业务需要我们必须排除万难,迎头赶上。

下面我们就来探讨一下Oracle的解决之道。

最常用的解决方法:分页查询。每次取出一部分数据,这样有利于利用索引,避免全表扫描,假如使用SELECT /*+ FIRST_ROWS */ * FROM  myTable效果更好。

假如一次查询某表的大部分数据,使用全表扫描更优于索引扫描,此时我们这些数据库工作者应该起点作用了。

1、表的碎片整理。在表数据的频繁修改之后,行链接和行迁移是很难避免的,表的碎片整理有利于全表扫描的时候,Oracle扫描最少的数据块。

2、将表改为分区表。按照业务逻辑将表数据分区存储。

3、仍然是设计问题。将表空间和索引空间分离,尽量减少扫描Oracle读取指针的扫描范围。

4、使用物化视图。在Oracle的内存中检索数据,已达到数据的查询最快化。

5、在需要Full Table Scan的时候避免Fast Full Index Scan。

6、对于大表增加data buffer,对于小表使用keep buffer。

7、减少pctused值,用空间换速度。(哈哈,有钱才行,没钱的量力而为)

8、将大表建立在哈希簇中。

9、将表改为索引组织表。

10、使用并行查询。

11、使用压缩数据表。

12、应用数据库六范式,最大化的消除数据冗余。

13、将select * 中的 *  改为字段名以避免查询语句再到数据字典中查询列名。

可惜Oracle不提供类似SQL Server的临时表用来提升查询性能。

近期失业在家,一次面试问到这个问题,当时没答上,回家后花了一个晚上总结了一下,现在特共享以求探讨,看看大家还有什么其它的方法。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16573/viewspace-434610/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/16573/viewspace-434610/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值