Oracle数据库SQL语句性能调整的基本原则(3)

作者:kdinzh 来源:赛迪网 时间:2009-03-25 16:55:00 

在全表搜索是一个最快的访问方法时,将小表的全表搜索放到缓存中,调优专家应该确保有一个专门的数据缓冲用作行缓冲。在Oracle7中,你可以使用altertablexxxcache语句,在Oracle8或以上,小表可以被强制为放到KEEP池中缓冲。

确保最优的索引使用:对于改善查询的速度,这是特别重要的。有时Oracle可以选择多个索引来进行查询,调优专家必须检查每个索引并且确保Oracle使用正确的索引。它还包括bitmap和基于函数的索引的使用。

确保最优的JOIN操作:有些查询使用NESTEDLOOPjoin快一些,有些则是HASHjoin快一些,另外一些则是sort-mergejoin更快。

这些规则看来简单,不过它们占SQL调优任务的100%,并且它们也无需完全懂得OracleSQL的内部运作。以下我们来简单概览以下OracleSQL的优化。

我们首先简要查看Oracle的排序,并且看一看排序操作是如何影响性能的。

调整Oracle的排序操作

排序是SQL语法中一个小的方面,但很重要,在Oracle的调整中,它常常被忽略。当使用createindex、ORDERBY或者GROUPBY的语句时,Oracle数据库将会自动执行排序的操作。通常,在以下的情况下Oracle会进行排序的操作:

使用Orderby的SQL语句

使用Groupby的SQL语句

在创建索引的时候

进行tablejoin时,由于现有索引的不足而导致SQL优化器调用MERGESORT

当与Oracle建立起一个session时,在内存中就会为该session分配一个私有的排序区域。如果该连接是一个专用的连接(dedicatedconnection),那么就会根据init.ora中sort_area_size参数的大小在内存中分配一个ProgramGlobalArea(PGA)。如果连接是通过多线程服务器建立的,那么排序的空间就在large_pool中分配。不幸的是,对于所有的session,用做排序的内存量都必须是一样的,我们不能为需要更大排序的操作分配额外的排序区域。因此,设计者必须作出一个平衡,在分配足够的排序区域以避免发生大的排序任务时出现磁盘排序(disksorts)的同时,对于那些并不需要进行很大排序的任务,就会出现一些浪费。当然,当排序的空间需求超出了sort_area_size的大小时,这时将会在TEMP表空间中分页进行磁盘排序。磁盘排序要比内存排序大概慢14,000倍。

上面我们已经提到,私有排序区域的大小是有init.ora中的sort_area_size参数决定的。每个排序所占用的大小由init.ora中的sort_area_retained_size参数决定。当排序不能在分配的空间中完成时,就会使用磁盘排序的方式,即在Oracle实例中的临时表空间中进行。

磁盘排序的开销是很大的,有几个方面的原因。首先,和内存排序相比较,它们特别慢;而且磁盘排序会消耗临时表空间中的资源。Oracle还必须分配缓冲池块来保持临时表空间中的块。无论什么时候,内存排序都比磁盘排序好,磁盘排序将会令任务变慢,并且会影响Oracle实例的当前任务的执行。还有,过多的磁盘排序将会令freebufferwaits的值变高,从而令其它任务的数据块由缓冲中移走。

标签:Oracle数据库,SQL语句,性能,调整,基本原则
0
投稿

猜你喜欢

  • python 基于Apscheduler实现定时任务

    2022-03-29 00:53:32
  • ASP中Cookies集合使用方法详解

    2007-09-14 10:16:00
  • Python 中的Sympy详细使用

    2021-10-03 03:22:45
  • redis服务器环境下mysql实现lnmp架构缓存

    2024-01-20 01:44:29
  • asp智能脏话过滤系统v1.0

    2011-04-14 11:00:00
  • mysql5.7.19 winx64解压缩版安装配置教程

    2024-01-19 08:49:09
  • 简单聊聊Python中的鸭子类型和猴子补丁

    2022-06-17 00:32:58
  • oracle join on 数据过滤问题

    2009-07-14 21:17:00
  • GO语言不固定参数函数与匿名函数的使用

    2024-02-17 14:42:17
  • Python实战小项目之Mnist手写数字识别

    2023-01-20 23:24:56
  • python利用OpenCV2实现人脸检测

    2021-05-14 11:03:45
  • MySQL中随机生成固定长度字符串的方法

    2010-12-08 16:25:00
  • python调用cmd命令行制作刷博器

    2023-07-26 15:18:35
  • 在macOS上搭建python环境的实现方法

    2021-10-07 07:29:56
  • 封装了一个js图片轮换效果的函数

    2024-06-21 20:21:48
  • block 和 inline 的区别是?

    2009-12-08 13:00:00
  • 基于vue v-for 循环复选框-默认勾选第一个的实现方法

    2024-05-13 09:38:01
  • JS实现淘宝支付宝网站的控制台菜单效果

    2023-07-22 22:26:12
  • python机器学习MATLAB最小二乘法的两种解读

    2022-02-19 08:00:11
  • Python合并Excel表(多sheet)的实现

    2023-08-06 21:59:11
  • asp之家 网络编程 m.aspxhome.com