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/