欢迎来到天天文库
浏览记录
ID:59416092
大小:145.50 KB
页数:41页
时间:2020-09-19
《ORACLE性能优化之二ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、ORACLE性能优之SQL优化主讲:YOUNGER7/29/20211数据规模库分类(一)数据库描述数据规模示例库(Sample)小于1M测试库(ExperimentorTest)100M到2G微型库(Tiny)小于1G超小型库(VerySmall)1G到5G小型库(Small)5G到10G中底等库(Moderate)10G到50G7/29/20212数据库规模分类(二)数据库描述数据规模中等库(Medium)50G到100G大型库(Large)100G到200G超大库Verylarge(VLDB)200G到300G极大库(E
2、xtremely)300G到500G巨大库(Massive)500G以上7/29/20213性能指标时间存储内存使用与硬盘空间7/29/20214性能调优的二个方向CPUCPU使用率达到60%到75%I/OI/O操作达到80%左右7/29/20215性能优化三板斧一.优秀的设计(算法)与SQL语句二.存储与索引三.数据库配置与系统参数7/29/20216算法编程=算法+数据结构7/29/20217SQL最基本的数据操作语句SELECTUPDATEINSERTDELETE7/29/20218SELECT语句SELECT语句可以从
3、一个或多个表中选取特定的行和列并以虚拟表的形式返回结果集,通常还会用到表连接,ORDERBY排序与GROUPBY分组等操作.因为查询,检索与统计数据是数据库中最重要的功能,所以SELECT语句在SQL中是工作量最大的部分。性能要点:索引起正作用7/29/20219UPDATE语句UPDATE语句允许用户对已知的表中对符合条件的现有行相关列值进行修改。UPDATE首先要定位需要修改的记录,所以它的元操作就包括了SELECT的操作.性能要点:索引正作用,新值使用子查询需要特别注意7/29/202110INSERT语句用户可以用IN
4、SERT语句将新记录插入到指定的一个表中。执行INSERT语句时,系统将试着将这些值填入到相应的列中,这时如果有主键或其它约束条件则会进行合法性判断.如有索引则需要重排索引.性能要点:索引起负作用7/29/202111DELETE语句DELETE语句用来删除已知表中的行。如同UPDATE语句中一样,所有满足WHERE子句中条件的行都将被删除。7/29/202112高效的SQL语句写法(以下部分内容摘录于罗宇辉)7/29/202113高效的SQL语句(1)选择最有效率的表名顺序(只在基于规则的优化器中
5、有效)ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表drivingtable)将被最先处理。在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表如果tab2中记录数明显高于tab1,用SELECTCOUNT(*)FROMtab2,tab1效率明显优于SELECTCOUNT(*)FROMtab1,tab27/29/202114高效的SQL语句(2)如果有3个以上的表连接查询,那就需要选择交叉表(intersectiontable)作为基础表,交叉表是指那
6、个被其他表所引用的表SELECT*FROMlocationl,categoryc,empeWHEREe.emp_noBETWEEN1000AND2000ANDe.cat_no=c.cat_noANDe.locn=l.locn效率高于SELECT*FROMempe,locationl,categorycWHEREe.emp_noBETWEEN1000AND2000ANDe.cat_no=c.cat_noANDE.locn=l.locn7/29/202115高效的SQL语句(3)WHERE子句中的连接顺序ORACLE采用自下而上的
7、顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾SELECT…FROMempeWHERE sal>50000AND job=‘MANAGER’AND 25<(SELECTCOUNT(*)FROMemp WHEREmgr=e.empno)效率低于SELECT…FROMempeWHERE25<(SELECTCOUNT(*)FROMemp WHEREmgr=e.empno)AND sal>50000AND job=‘MANAGER’;
8、7/29/202116高效的SQL语句(4)SELECT子句中避免使用‘*’当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用‘*’是一个方便的方法。不幸的是,这是一个非常低效的方法。实际上,Oracle在解析的过程中,会将‘*’依次转换成所有的列名,这
此文档下载收益归作者所有