Oracle系统优化

  • 电脑网络维修
  • 2024-11-14

Oracle系统优化是咱们经常要思索的疑问,上方就为您引见一些系统优化方面的常识,宿愿对您学习Oracle系统优化方面能有所协助。

运行程序性能的优化

运行程序的优化通常可分为两个方面:源代码和SQL语句。由于触及到对程序逻辑的扭转,源代码的优化在期间老本微危险上代价很高,而对数据库系统性能的优化收效有限,因此Oracle系统优化应着重在SQL语句的优化。关于海量数据,劣质SQL语句和优质SQL语句之间的速度差异可以到达上百倍,可见关于一个系统不是便捷地能成功其配置就行,而是要写出高品质的SQL语句,提高系统的可用性。

上方就某些SQL语句的where子句编写中须要留意的疑问作具体引见。在这些where子句中,即使某些列存在索引,但是由于编写了劣质的SQL,系统在运转该SQL语句时也不能经常使用该索引,而雷同经常使用全表扫描,这就形成了照应速度的极大降落。

1. IS NULL 与 IS NOT NULL

不能用null作索引,任何蕴含null值的列都将不会被蕴含在索引中。即使索引有多列的状况下,只需这些列中有一列含有null,该列就会从索引中扫除。也就是说假设某列存在空值,即使对该列建索引也不会提高性能。

任何在where子句中经常使用is null或is not null的语句优化器是不准许经常使用索引的。

2. 联接列

关于有联接的列,即使最后的联接值为一个静态值,优化器不会经常使用索引的。例如,假设有一个职工表(employee),关于一个职工的姓和名分红两列寄存(FIRST_NAME和LAST_NAME),如今要查问一个叫乔治•布什(George Bush)的职工。 上方是一个驳回联接查问的SQL语句:

select * from employee where first_name||''||last_name ='George Bush';

上方这条语句齐全可以查问出能否有George Bush这个员工,但是这里须要留意,系统优化器对基于last_name创立的索引没有经常使用。

当驳回上方这种SQL语句的编写,Oracle系统就可以驳回基于last_name创立的索引:

Select * From employee where first_name ='George' and last_name ='Bush';

遇到上方这种状况又如何处置呢?假设一个变量(name)中寄存着George Bush这个员工的姓名,关于这种状况咱们又如何防止全程遍历经常使用索引呢?可以经常使用一个函数,将变量name中的姓和名分开就可以了,但是有一点须要留意,这个函数是不能作用在索引列上。上方是SQL查问脚本:

select * from employee where first_name = SUBSTR('&&name',1,INSTR('&&name',' ')-1)

and last_name = SUBSTR('&&name',INSTR('&&name’,' ')+1) ;

3. 带通配符(%)的like语句

雷同以上方的例子来看这种状况。目前的需求是这样的,要求在职工表中查问名字中蕴含Bush的人。可以驳回如下的查问SQL语句:

select * from employee where last_name like '%Bush%';

这里由于通配符(%)在搜索词首产生,所以Oracle系统不经常使用last_name的索引。在很多状况下或许不可防止这种状况,但是必定要心中有底,通配符如此经常使用会降落查问速度。但是当通配符出如今字符串其余位置时,优化器就能应用索引。例如,在上方的查问中索引获取了经常使用:

select * from employee where last_name like 'c%';

4. Order by语句

Order by语句选择了Oracle如何将前往的查问结果排序。Order by语句对要排序的列没有什么特意的限度,也可以将函数加出列中(象联接或许附加等)。任何在Order by语句的非索引项或许有计算表白式都将降落查问速度。

细心审核order by语句以找出非索引项或许表白式,它们会降落性能。处置这个疑问的方法就是重写order by语句以经常使用索引,也可认为所经常使用的列建设另外一个索引,同时应相对防止在order by子句中经常使用表白式。

咱们在查问时经常在where子句经常使用一些逻辑表白式,如大于、小于、等于以及不等于等等,也可以经常使用and(与)、or(或)以及not(非)。NOT可用来对任何逻辑运算符号取反。上方是一个NOT子句的例子:

... where not (status ='VALID')

假设要经常使用NOT,则应在取反的短语前面加上括号,并在短语前面加上NOT运算符。NOT运算符蕴含在另外一个逻辑运算符中,这就是不等于(<>)运算符。换句话说,即使不在查问where子句中显式地参与NOT词,NOT仍在运算符中,见下例:

... where status <>'INVALID';

再看上方这个例子:

select * from employee where salary<>3000;

对这个查问,可以改写为不经常使用NOT的语句:

select * from employee where salary<3000 or salary>3000;

虽然这两种查问的结果一样,但是第二种查问打算会比第一种查问打算更快些。第二种查问准许Oracle对salary列经常使用索引,而第一种查问则不能经常使用索引。

6. IN和EXISTS

有时刻会将一列和一系列值相比拟。最便捷的方法就是在where子句中经常使用子查问。在where子句中可以经常使用两种格局的子查问。

第一种格局是经常使用IN操作符: ... where column in(select * from ... where ...);

第二种格局是经常使用EXIST操作符: ... where exists (select 'X' from ...where ...);

绝大少数人会经常使用第一种格局,由于它比拟容易编写,而实践上第二种格局要远比第一种格局的效率高。在Oracle中可以将简直一切的IN操作符子查问改写为经常使用EXISTS的子查问。

第二种格局中,子查问以‘select 'X'’开局。运用EXISTS子句不论子查问从表中抽取什么数据它只检查where子句。这样优化器就不用遍历整个表而仅依据索引就可成功上班(这里假设在where语句中经常使用的列存在索引)。相关于IN子句来说,EXISTS经常使用相连子查问,结构起来要比IN子查问困难一些。

经过经常使用EXISTS,Oracle系统会首先审核主查问,而后运转子查问直到找到第一个婚配项,这就节俭了期间。Oracle系统在口头IN子查问时,首先口头子查问,并将取得的结果列表寄存在一个加了索引的暂时表中。在口头子查问之前,系统先将主查问挂起,待子查问口头终了,寄存在暂时表中再口头主查问。这也就是经常使用EXISTS比经常使用IN通常查问速度快的要素。

同时应尽或许经常使用NOT EXISTS来替代NOT IN,虽然二者都经常使用了NOT(不能经常使用索引而降落速度),但NOT EXISTS要比NOT IN查问效率更高。

【编辑介绍】

深度解析Oracle ERP系统模块

详解四大类Oracle索引扫描

Oracle查问重复记载的三种方法

查问记载时给oracle记载加锁

深化解读Oracle修正表结构

  • 关注微信

本网站的文章部分内容可能来源于网络和网友发布,仅供大家学习与参考,如有侵权,请联系站长进行删除处理,不代表本网站立场,转载联系作者并注明出处:https://duobeib.com/diannaowangluoweixiu/4635.html

猜你喜欢

热门标签

洗手盆如何疏浚梗塞 洗手盆为何梗塞 iPhone提价霸占4G市场等于原价8折 明码箱怎样设置明码锁 苏泊尔电饭锅保修多久 长城画龙G8253YN彩电输入指令画面变暗疑问检修 彩星彩电解除童锁方法大全 三星笔记本培修点上海 液晶显示器花屏培修视频 燃气热水器不热水要素 热水器不上班经常出现3种处置方法 无氟空调跟有氟空调有什么区别 norltz燃气热水器售后电话 大连站和大连北站哪个离周水子机场近 热水器显示屏亮显示温度不加热 铁猫牌保险箱高效开锁技巧 科技助力安保无忧 创维8R80 汽修 a1265和c3182是什么管 为什么电热水器不能即热 标致空调为什么不冷 神舟培修笔记本培修 dell1420内存更新 青岛自来水公司培修热线电话 包头美的洗衣机全国各市售后服务预定热线号码2024年修缮点降级 创维42k08rd更新 空调为什么运转异响 热水器为何会漏水 该如何处置 什么是可以自己处置的 重庆华帝售后电话 波轮洗衣机荡涤价格 鼎新热水器 留意了!不是水平疑问! 马桶产生了这5个现象 方便 极速 邢台空调移机电话上门服务 扬子空调缺点代码e4是什么疑问 宏基4736zG可以装置W11吗 奥克斯空调培修官方 为什么突然空调滴水很多 乐视s40air刷机包 未联络视的提高方向 官网培修 格力空调售后电话 皇明太阳能电话 看尚X55液晶电视进入工厂形式和软件更新方法 燃气热水器缺点代码

热门资讯

关注我们

微信公众号