还剩15页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
Oracle SQL性能优化最佳实践・删除表中记录的时候,如果不需要恢复的情况之下应该尽量使用Truncate而不是Deleteo・仅适用于删除全表的记录Truncate.尽量多使用11COMMIT只要有可能,在程序中尽量多使用这样程序的性能得到提高,需求也会因为所COMMIT,COMMIT释放的资源而减少•COMMIT所释放的资源•回滚段上用于恢复数据的信息.•被程序语句获得的锁•redo logbuffer中的空间•ORACLE为管理上述3种资源中的内部花费.计算记录条数12Select count*from tablename;Select countlfrom tablename;Select countcolumnfromtablename;一般认为,在没有主键索引的情况之下,第二种方式最快如果只有一列且无索引COUNTQ反而比较快,如果有索引列,当然是使用索引列最快COUNT*COUNTcolumn.用子句替换子句13Where Having避免使用子句,只会在检索出所有记录之后才对结果集进行过滤这个处理需HAVING HAVING要排序、总计等操作如果能通过子句限制记录的数目,就能减少这方面的开销WHERE.减少对表的查询操作14・在含有子查询的SQL语句中,要注意减少对表的查询操作/*低效SQLVSELECT TAB_NAME FROM TABLESWHERE TAB_NAME二^SELECT TAB.NAME FROMTAB.COLUMNSWHERE VERSION604AND DB_VER=SELECT DB_VER FROMTAB.COLUMNSWHERE VERSION=604/*高效SQL*/SELECT TAB_NAME FROMTABLESWHERE TAB_NAME,DB_VER=SELECTTAB_NAME,DB_VERFROM TAB_COLUMNSWHERE VERSION=
604.使用表的别名15Alias当在语句中连接多个表时,请使用表的别名并把别名前缀于每个上.这样一来,就SQL Column可以减少解析的时间并减少那些由歧义引起的语法错误Column歧义指的是由于中不同的表具有相同的名,当语句中出现这个Column SQLColumn SQL时,解析器无法判断这个的归属Column SQLColumn用替代
9.9使用而非
14.11使用表的别名
21.Explain PlanSQL18的
25.Union OR26用替换
28.28使用替代
31.30使用提示
36.36优化
38.37使用显示游标
40.38语句执行步骤
1.SQL语法分析〉语义分析》视图转换>表达式转换〉选择优化器>选择连接方式>选择连接顺序>选择数据的搜索路径>运行执行计划选用适合的优化器
2.Oracle(基于规则)、(基于成本)、(选择性)RULE COSTCHOOSE访问的方式
3.Table全表扫描()全表扫描就是顺序地访问表中每条记录,采用一次读入多个数据块的ORACLE databaseblock方式优化全表扫描通过访问表ROWID包含了表中记录的物理位置信息,采用索引实现了数据和存放数据的物理位置ROWID ORACLE()之间的联系,通常索引提供了快速访问的方法,因此那些基于索引列的查询就ROWID ROWID可以得到性能上的提高共享语句
4.SQL・提供对执行过的语句进行高速缓冲的机制被解析过并且确定了执行路径的Oracle SQLSQL语句存放在的共享池中SGA・执行一个语句之前每次先从共享池中查找是否有缓冲的语句,如果有Oracle SQLSGA SQL则直接执行该语句SQL・可以通过适当调整SGA共享池大小来达到提高Oracle执行性能的目的选择最有效率的表名顺序
5.・ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表)将被最先处理driving table・当ORACLE处理多个表时,会运用排序及合并的方式连接它们,并且是从右往左的顺序处(理子句首先,扫描第一个表子句中最后的那个表)并对记录进行排序,然FROM FROM后扫描第二个表(子句中倒数第二个表),最后将所有从第二个表中检索出的记录与FROM第一个表中合适记录进行合并・只在基于规则的优化器中有效举例表条记录TAB116,384表条记录TAB21/*选择作为基础表最好的方法*执行时间TAB2/SELECT COUNTS FROM TABLTAB2/*秒*/
0.96/*选择作为基础表不佳的方法*/*执行时间TAB1/SELECT COUNT*FROMTAB2JAB1秒*/
26.09如果有个以上的表连接查询,那就需要选择交叉表作为基础表,交叉表3intersection table是指那个被其他表所引用的表/*高效的SQL*/SELECT*FROM LOCATIONL,CATEGORY CEMP EzWHEREE.EMP_NO BETWEEN1000AND2000AND E.CAT_NO=C.CAT_NOAND E.LOCN=L.LOCN将比下列更有效率SQL/*低效的SQLVSELECT*FROM EMPE LOCATIONL,CATEGORY CWHERE=zC.CAT_NOAND E.LOCN=L.LOCNAND E.EMP_NO BETWEEN1000AND2000子句中的连接顺序
6.Where・采用自下而上或自右向左的顺序解析子句根据这个原理,表之间的连Oracle WHERE接必须写在其他条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾WHERE/*低效,执行时间秒低
156.3SELECT ColumnlColumn2FROM EMPEWHEREE.SAL/50000AND EJOB=MANAGERAND25SELECT COUNT*FROM EMPWHERE MGR=E.EMPNO/*高效,执彳亍时间秒*
10.6/SELECT ColumnlColumn2FROMEMPEWHERE25SELECT/COUNTSFROMEMPWHEREMGR=E.EMPNOAND E.SAL50000AND EJOB=MANAGER子句中避免使用〃*〃
7.SELECT在解析语句的时候,对于“〃将通过查询数据库字典来将其转换成对应的列名如果Oracle SQL在子句中需要列出所有的时,建议列出所有的名称,而不是简Select ColumnColumn单的用来替代,这样可以减少多于的数据库查询开销减少访问数据库的次数
8.当执行每条语句时在内部执行了许多工作解析语句估算索引的利用率绑SQL,ORACLE SQL定变量读数据块等等由此可见,减少访问数据库的次数,就能实际上减少的工作量ORACLE整个简单无关联的数据库访问
9.如果有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系),以减少多于的数据库开销10虽然采取这种方法,效率得到提高,但是程序的可读性大大降低,所以还是要权衡之间的利弊.使用而非10Truncate Delete表中记录的时候,会在段中保存删除信息以备恢复删除表中•Delete OracleRollback Truncate记录的时候不保存删除信息,不能恢复因此删除记录比快,Truncate Delete而且占用资源少。
个人认证
优秀文档
获得点赞 0