使用plsql执行计划进行sql调优

时间:2024.3.19

使用plsql执行计划进行sql调优(转载) 一段SQL代码写好以后,可以通过查看SQL的执行计划,初步预测该SQL在运行时的性能好坏,尤其是在发现某个SQL语句的效率较差时,我们可以通过查看执行计划,分析出该SQL代码的问题所在。

那么,作为开发人员,怎么样比较简单的利用执行计划评估SQL语句的性能呢?总结如下步骤供大家参考:

1、 打开熟悉的查看工具:PL/SQL Developer。

在PL/SQL Developer中写好一段SQL代码后,按F5,PL/SQL Developer会自动打开执行计划窗口,显示该SQL的执行计划。

2、 查看总COST,获得资源耗费的总体印象

一般而言,执行计划第一行所对应的COST(即成本耗费)值,反应了运行这段SQL的总体估计成本,单看这个总成本没有实际意义,但可以拿它与相同逻辑不同执行计划的SQL的总体COST进行比较,通常COST低的执行计划要好一些。

3、 按照从左至右,从上至下的方法,了解执行计划的执行步骤

执行计划按照层次逐步缩进,从左至右看,缩进最多的那一步,最先执行,如果缩进量相同,则按照从上而下的方法判断执行顺序,可粗略认为上面的步骤优先执行。每一个执行步骤都有对应的COST,可从单步COST的高低,以及单步的估计结果集(对应ROWS/基数),来分析表的访问方式,连接顺序以及连接方式是否合理。

4、 分析表的访问方式

表的访问方式主要是两种:全表扫描(TABLE ACCESS FULL)和索引扫描(INDEX SCAN),如果表上存在选择性很好的索引,却走了全表扫描,而且是大表的全表扫描,就说明表的访问方式可能存在问题;若大表上没有合适的索引而走了全表扫描,就需要分析能否建立索引,或者是否能选择更合适的表连接方式和连接顺序以提高效率。

5、 分析表的连接方式和连接顺序

表的连接顺序:就是以哪张表作为驱动表来连接其他表的先后访问顺序。

表的连接方式:简单来讲,就是两个表获得满足条件的数据时的连接过程。主要有三种表连接方式,嵌套循环(NESTED LOOPS)、哈希连接(HASH JOIN)和排序-合并连接(SORT MERGE JOIN)。我们常见得是嵌套循环和哈希连接。 嵌套循环:最适用也是最简单的连接方式。类似于用两层循环处理两个游标,外层游标称作驱动表,Oracle检索驱动表的数据,一条一条的代入内层游标,查找满足WHERE条件的所有数据,因此内层游标表中可用索引的选择性越好,嵌套循环连接的性能就越高。

哈希连接:先将驱动表的数据按照条件字段以散列的方式放入内存,然后在内存中匹配满足条件的行。哈希连接需要有合适的内存,而且必须在CBO优化模式下,连接两表的WHERE条件有等号的情况下才可以使用。哈希连接在表的数据量较大,表中没有合适的索引可用时比嵌套循环的效率要高。

6、 请核心技术组协助分析

以上步骤可以协助我们初步分析SQL性能问题,如果遇到连接表太多,执行计划过于复杂,可联系核心技术组共同讨论,一起寻找更合适的SQL写法或更恰当的索引建立方法

总结两点:

1、这里看到的执行计划,只是SQL运行前可能的执行方式,实际运行时可能因为软硬件环境的不同,而有所改变,而且cost高的执行计划,不一定在实际运行起来,速度就一定差,我们平时需要结合执行计划,和实际测试的运行时间,来确定一个执行计划的好坏。

2、对于表的连接顺序,多数情况下使用的是嵌套循环,尤其是在索引可用性好的情况下,使用嵌套循环式最好的,但当ORACLE发现需要访问的数据表较大,索引的成本较高或者没有合适的索引可用时,会考虑使用哈希连接,以提高效率。排序合并连接的性能最差,但在存在排序需求,或者存在非等值连接无法使用哈希连接的情况下,排序合并的效率,也可能比哈希连接或嵌套循环要好。

使用plsql执行计划进行sql调优

I:几种主要表连接的比较


第二篇:plSql使用手册1


·PL/SQL Developer使用技巧

1、PL/SQL Developer记住登陆密码

在使用PL/SQL Developer时,为了工作方便希望PL/SQL Developer记住登录Oracle的用户名和密码;

设置方法:PL/SQL Developer 7.1.2 ->tools->Preferences->Oracle->Logon History , "Store history"是默认勾选的,勾上"Store with password" 即可,重新登录在输入一次密码则记住了。

2、执行单条SQL语句

在使用PL/SQL Developer的SQL Window时,按F8键,PL/SQL Developer默认是执行该窗口的所有SQL语句,需要设置为鼠标所在的那条SQL语句,即执行当前SQL语句;

设置方法:PL/SQL Developer 7.1.2 -->tools->Preferences-->Window types ,勾上"AutoSelect Statement" 即可。

3、格式化SQL语句

在使用PL/SQL Developer的SQL Window时,有时候输入的SQL语句太长或太乱,希望能用比较通用的写法格式话一下,这样看起来会好看些,也好分析; 使用方法:选中需要格式化的SQL语句,然后点击工具栏的PL/SQL beautifier按钮即可.

4、查看执行计划

在使用PL/SQL Developer的SQL Window时,有时候输入的SQL语句执行的效率,分析下表结构,如何可以提高查询的效率,可以通过查看Oracle提供的执行计划;

使用方法:选中需要分析的SQL语句,然后点击工具栏的Explain plan按钮(即执行计划),或者直接按F5即可。

5、调试存储过程

在使用PL/SQL Developer操作Oracle时,有时候调用某些存储过程,或者调试存储过程;

调用存储过程的方法:首先,在PL/SQL Developer左边的Browser中选择

Procedures,查找需要调用的存储过程;然后,选中调试的存储过程,点击右键,选择Test,在弹出来的Test scrīpt窗口中,对于定义为in类型的参数,需要给该参数的Value输入值;最后点击上面的条数按钮:Start debugger 或者按F9;最后点击:RUN 或者Ctrl+R

·Oracle学习手册:新手常见错误小集

没有人会否认ORACLE是全球最有影响的数据库产品之一;不过好的东西似乎总不是那么好用(初看起来如此),甚至有些无情--总会给layman们一个个无情的错误号。下面是我个人的总结,条条有用,希望能给初学者一点启示。

关于"好的东西似乎总不是那么好用(初看起来如此)"的一个笑话:在参加 IBM DB2 512、513培训前,在校园网上下载到了安装程序,不过任凭我们几个同学研究个半天,也不知哪个文件是安装文件,竟没有安装成功。最后,一致认为:看来这个培训真是太有必要了!事后,才知道--我们下载的是4linux的!

[以8.1.6为例]:

1、ORA-12541:TNS:没有监听器

原因:没有启动监听器或者监听器损坏。如果是前者,使用命令net start OracleOraHome81TNSListener(名字可能有出入)即可;如果是后者,则使用"Net8 Configuration Assistant"工具向导之"监听程序配置"增加一个监听器即可(基本不用写任何信息,一路OK。在添加之前可能需要把所有的监听器先删除!)

2、ORA-12500:TNS:监听程序无法启动专用服务器进程

ORA-12560:TNS:协议适配器错误

原因:ORACLE的数据库服务没有启动。使用命令net start

ORACLESERVICEORADB(ORADB为数据库名字)即可。如果仍没有解决,请继续向下看。

3、如果数据库服务启动失败,则很有可能是其注册表项值损坏,最好的做法是以下两步:

1)ORADIM -DELETE -SID oradb 删除数据库服务项

2)ORADIM -NEW -SID oradb 新增数据库服务项

注:这个过程中如果出错,就重启计算机!

4、ORA-12154:TNS:能解析服务名

原因:ORACLE的网络服务名没有正确配置。请使用"Net8 Configuration Assistant"工具向导之"本地网络服务名配置"配置TNS即可。如果仍没有解决,请继续向下看。

5、ORA-1034 :TNS:ORACLE不可用

原因:ORACLE的数据库服务正确启动,但是数据库没有打开!

使用命令:

1)svrmgrl 启动服务管理器

2)connect internal 以internal身份登陆

3)startup 打开数据库

6、ORA-12560:TNS:协议适配器错误(顽固性的)

原因:未知。

解决:必杀技--打开"Windows任务管理器",杀死ORACLE.exe及ORADIM.exe进程,书写自己的ora_startup.bat,执行之!

PS:

1、我的ora_startup.bat:

net start OracleOraHome81TNSListener

net start ORACLESERVICEORADB

svrmgrl 一般情况下不用,不过有时少不了它的,具体步骤见第5步。

2、我的ora_shutdown.bat:

net stop OracleOraHome81TNSListener

net stop ORACLESERVICEORADB

3、ORACLE相关服务名请参见"管理工具"之"服务"中以ORACLE开头的服务名。

·Oracle 10g绿色客户端 plus PL/SQL Developer-搭建方便的Oracle客户端使用环境

整个一个暑假都在做基于Oracle的一个数据处理程序。但是一直没有找到合适的人工访问实验室的数据库的方便的方法。

最酷的时候我的做法是自己写个程序用JDBC连接数据库自己扒下想要的表格……

后来发现实验室里边有很多机器是装过Oracle客户端的,但是ms都是当时实验室搭建数据库时用正版的安装光盘装的,我对这样臃肿的客户端有一种生理上的恐惧,于是还是用原始的方法进行自己的开发。

直到有一天,看到Oracle的官方网站上边有10g的绿色版的简易客户端…… /technology/tech/oci/instantclient/index.html Oracle的官方网站下载软件是要帐户的,这个申请一个就是了,本人没有网上的空间存放相关的软件,即使有也没有官网上的可靠和持久,所以就只给一个链接了。

http://www.allroundautomations.nl/plsqldev.html

PL/SQL Developer是一个开发与数据库相关工程的软件,ms是Free的,不大了解,只不过看到很多开发Oracle相关数据库的人都在用,我一般只用来当作与数据库服务器交互用的Client界面……,最多的时候主要是开一个窗口敲SQL语句,(杀鸡用牛刀了……)

下边是安装的过程,由于是免安装的,所以要自己配置一些环境变量和文件,比较麻烦……

首先将下载的Oracle客户端的压缩包解压到一个路径,在本机上解压到了E:\OracleClient下边,所以,实际上Oracle客户端的路径是E:\OracleClient\instantclient_10_2

然后进入instantclient_10_2文件夹,新建一个network文件夹,并在network文件夹下新建admin文件夹,在admin文件夹中新建名为tnsnames.ora文件,这个文件是用来配置连接远程数据库的登录信息的(客户端软件都会从这个相对路径下的文件中获取连接数据库的信息),内容如下:

databasename =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = ip address)(PORT = 1521)) )

(CONNECT_DATA =

(SERVICE_NAME = database name)

)

)

例如我链接实验室数据库的对应文件内容是:

TCM =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = *.*.*.*)(PORT = 1521))

)

(CONNECT_DATA =

(SERVICE_NAME = TCM)

)

)

IP我就不写出来了,我所用的数据库名为TCM,so……

然后安装PL/SQL Developer,过程是傻瓜式的。进入PL/SQL后(开始进入时会要求登录数据库,但是现在PL/SQL现在还找不到你的Oracle客户端,所以登录是不会成功的,但是可以进入软件),选择Tools->Preferences,在Oracle Home OCI Library两栏中分别填入Oracle客户端的路径和OCI文件的路径(oci.dll文件直接在instantclient_10_2文件夹下),所以我在这两个选项中填写的内容是"E:\OracleClient\instantclient_10_2"和"E:\OracleClient

\instantclient_10_2\oci.dll"。这时再登录就可以登录成功了。如若还不行就重启一下PL/SQL。

绿色版的客户端可能会出现对于中文支持的问题,这主要是因为服务器端指定的字符集和客户端所默认的字符集是不相同的导致的,只要找到服务器端的字符集设置,然后将客户端的字符集设置与服务器端保持一致就好了。修改客户端字符集设置的方法有好几种,可以修改注册表,也可以用环境变量的方法解决。不过我这里介绍的客户端是绿色版的,只是解压到某一个路径而已,所以注册表的方法在这里不是很适用,所以我写了一个启动脚本,在启动PL/SQL之前,先建一个临时环境变量 nls_lang,并给变量赋值,再启动软件。(我曾经做过实验,通过建立系统环境变量的方法在这里是行不通的,具体的原因我说不清楚><)

我的脚本plsql.bat的内容如下:

setnls_lang=SIMPLIFIED CHINESE_CHINA.ZHS16GBK

cd "c:\Program Files\PLSQL Developer"

PLSQLDev.exe

其中第二行进入的路径是PL/SQL Developer安装到的路径。

我这里的实际情况是服务器端的字符集设置为SIMPLIFIED

CHINESE_CHINA.ZHS16GBK,所以我将这个值赋给nls_lang。通过运行plsql.bat脚本就可以正常的访问服务器数据库了。

更多相关推荐:
PLSQL 执行sql语句 F5 快捷键的解释

通过F5查看到的执行计划其实是plsqldeveloper工具内部执行查询plantable表然后格式化的结果selectfromplantablewherestatementid3939其中Descripti...

oracle定时执行plsql

DBMSJob包的用法包含以下子过程Broken过程change过程Interval过程Isubmit过程NextDate过程Remove过程Run过程Submit过程UserExport过程What过程1Br...

Oracle执行计划详解

Oracle执行计划详解目录一相关的概念Rowid的概念RecursiveSql概念Predicate谓词DRivingTable驱动表ProbedTable被探查表组合索引concatenatedindex可...

Oracle数据库执行计划的一些基本概念

Oracle数据库执行计划的一些基本概念一相关的概念Rowid的概念rowid是一个伪列既然是伪列那么这个列就不是用户定义而是系统自己给加上的对每个表都有一个rowid的伪列但是表中并不物理存储ROWID列的值...

Oracle查看执行计划

有三种方法1Explainplanexplainplanforselectfromaa查看结果selectfromtabledbmsxplandisplay2AutotraceSettimingon记录所用时间...

sql执行顺序和原理

一sql语句的执行步骤1语法分析分析语句的语法是否符合规范衡量语句中各表达式的意义2语义分析检查语句中涉及的所有数据库对象是否存在且用户有相应的权限3视图转换将涉及视图的查询语句转换为相应的对基表查询语句4表达...

Oracle执行计划

关于Oracle中执行计划稳定性深入研究1来源数据库技术网编辑若水时间20xx0514什么是执行计划所谓执行计划顾名思义就是对一个查询任务做出一份怎样去完成任务的详细方案举个生活中的例子我从珠海要去英国我可以选...

sql生成执行计划时出错

普通用户scott开启追踪日志时报错SCOTTsungtsetautotracetraceonlySP20618CannotfindtheSessionIdentifierCheckPLUSTRACErolei...

怎样看懂Oracle的执行计划

一什么是执行计划AnexplainplanisarepresentationoftheaccesspaththatistakenwhenaqueryisexecutedwithinOracle二如何访问数据At...

如何看懂Oracle执行计划

如何看懂ORACLE执行计划一什么是执行计划AnexplainplanisarepresentationoftheaccesspaththatistakenwhenaqueryisexecutedwithinO...

看懂SqlServer查询计划

对于SqlServer的优化来说可能优化查询是很常见的事情关于数据库的优化本身也是一个涉及面比较的广的话题本文只谈优化查询时如何看懂SqlServer查询计划由于本人对SqlServer的认识有限如有错误也恳请...

DB2_存储过程执行计划的查看及监控方法

一编写存储过程db2inst1db2labcattestsqlcreateproceduresalesstatusinquotaintegerdynamicresultsets2languagesqlbegin...

使用plsql执行计划进行sql调优(1篇)