用智能优化限制提高Oracle数据库性能
2007-05-11 12:23:17 来源:WEB开发网Oracle SQL运行时间的最主要的组成部分是花在为执行准备新的SQL语句上的时间。不过,如果了解了可执行计划产生的内在机制,你就可以控制Oracle花费在评估表的连接顺序的时间,并在总体上提高查询的性能。
准备为执行提供的SQL语句
在一个SQL语句进入Oracle库的cache之后、而真正被执行之前,将会依次发生如下事件:
语法检查——检查该SQL语句的拼写和词序是否正确。
语义解析——Oracle根据数据词典(data dictionary)来验证所有的表格(table)和列(column)。
已保存纲要检查——Oracle检查词典以确认对应该SQL语句是否已存在已保存的纲要(Stored Outline)。
产生执行计划——Oracle根据一种罚值(cost-based)优化算法和数据词典中的统计数据来决定如何生成最优执行计划。
产生二进制代码——Oracle在执行计划的基础上生成可执行的二进制代码。
一旦开始准备执行SQL语句,上述的过程很快就会执行,这是因为Oracle可以识别出同样的SQL语句并对同样的SQL语句重复使用对应的可执行代码。然而,对产生ad hoc SQL的系统以及SQL中嵌入文本值(literal value)的情况,SQL执行计划的生成时间就会变得相当长,而且以前的执行计划也常常不能被再次利用。对那些牵涉到许多表格的查询,Oracle可能要花上很长的时间来决定把连接这些表格的顺序。
评估连接表格的顺序
生成可执行计划的时间往往是SQL的准备过程中最大的开销组成部分,尤其是在处理有多个表的连接的查询的情况下。当Oracle评估表的连接顺序时,它必须考虑每一种可能的排序。例如,当有六个表格需要连接时,Oracle需要考虑720种(6的排列数,即6×5×4×3×2×1=720)可能的连接排序。当需要连接的表的数量超过10时,这个排列问题将变得非常突出:如果需要连接的表格有15个,那么需要考虑的可能的查询排列顺序超过一万亿种(精确值为1,307,674,368,000)。
更多精彩
赞助商链接