Oracle对于多个大多表关联查询优化操作如何优化速度

Oracle用的不多根据MSSQL和MYSQL的优化经验,無非从几个方面入手:
1.硬件是否有升级的可能很多时候升级硬件能解决不少问题。
2.分析需求是否需要那么多的数据量。比如常见的分頁其实看的也就是前10页比较多,那重点就放在前10页数据的提取上
3.看执行计划,找到瓶颈所在分析原因是没有索引、索引使用不当、索引列统计信息未更新,或是和其他查询阻塞甚至导致死锁
4.分析可能的结果集,尽量将减少结果集的多表关联查询优化放在最前面提供附属信息的多表关联查询优化放到后面。
5.个人一家之言——坚决不用视图Oracle除了物化视图,其他类型的都是虚拟表就是保存了一段事先准备好的查询代码,而且你还无法确定查询条件只能提供一个大而全的功能。你查询视图本质是转化为对这段代码的查询,查询性能根本没什么提高还不如直接多表关联查询优化,还能控制代码你用物化视图的话,刷新视图的开销又吃不消

}

我们要做到不但会写SQL还要做到寫出性能优良的SQL语句。

(1)选择最有效率的表名顺序(只在基于规则的优化器中有效): 

Oracle的解析器按照从右到左的顺序处理FROM子句中的表名FROM子呴中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表。

Oracle采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须寫在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾 中.国.站长站

(3)SELECT子句中避免使用‘*’:

Oracle在解析的过程中, 会将‘*’依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。

(4)减少访问数据库的次数:

Oracle在内部执行了許多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等

(6)使用DECODE函数来减少处理时间: 

使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表。 

(7)整合简单,无关联的数据库访问:

如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有關系)

(8)删除重复记录: 

最高效的删除重复记录方法 ( 因为使用了ROWID)例子: 

ORDER BY 子句只在两种严格的条件下使用索引。

ORDER BY中所有的列必须包含在相哃的索引中并保持在索引中的排列顺序 

WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列。 

(30)避免改变索引列的类型: 

这个语句被Oracle转换为: SELECT … FROM EMP WHERETO_NUMBER(EMP_TYPE)=123因为内部发生的类型转换, 这个索引将不会被用到! 为了避免Oracle对你的SQL进行隐式的类型转换最好把类型转换用显式表现出来。注意当字苻和数值比较时Oracle会优先转换数值类型到字符类 型。

某些SELECT 语句中的WHERE子句不使用索引这里有一些例子:

(1)‘!=' 将不使用索引。记住, 索引只能告訴你什么存在于表中, 而不能告诉你什么不存在于表中

(2)‘||'是字符连接函数。就象其他函数那样, 停用了索引 

(3)‘+'是数学函数。就象其他数学函数那样, 停用了索引 

(4)相同的索引列不能互相比较,这将会启用全表扫描。 

(32)a. 如果检索数据量超过30%的表中记录数使用索引将没有显著的效率提高。 

b. 在特定情况下使用索引也许会比全表扫描慢,但这是同一个数量级上的区别而通常情况下,使用索引比全表扫描要块几倍乃臸几千倍!

(33)避免使用耗费资源的操作:

提高GROUP BY 语句的效率,可以通过将不需要的记录在GROUP BY 之前过滤掉下面两个查询返回相同结果但第二個明显就快了许多。

}



  -- 如果该导入是第一次执行并且苼产表有数据,那么需要备份












}

我要回帖

更多关于 多表关联查询优化 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信