要为一个语句生成执行计划,可以有几种方法
要为一个语句生成执行计划,可以有3种方法: 1).最简单的办法 Sql> set autotrace on Sql> select * from dual;执行完语句后,会显示explain plan 与统计信息。
这个语句的优点就是它的缺点,这样在用该方法查看执行时间较长的sql语句时,需要等待该语句执行成功后,才返回执行计划,使优化的周期大大增长。 如果不想执行语句而只是想得到执行计划可以采用:Sql> set autotrace traceonly这样,就只会列出执行计划,而不会真正的执行语句,大大减少了优化时间。
虽然也列出了统计信息,但是因为没有执行语句,所以该统计信息没有用处,如果执行该语句时遇到错误,解决方法为: (1)在要分析的用户下:Sqlplus > @ ?rdbmsadminutlxplan。 sql (2) 用sys用户登陆Sqlplus > @ ?sqlplusadminplustrce。
sqlSqlplus > grant plustrace to user_name; user_name是上面所说的分析用户 2).用explain plan命令 (1) sqlplus > @ ?rdbmsadminutlxplan。 sql (2) sqlplus > explain plan set statement_id =’???’ for select ……………… 注意,用此方法时,并不执行sql语句,所以只会列出执行计划,不会列出统计信息,并且执行计划只存在plan_table中。
所以该语句比起set autotrace traceonly可用性要差。需要用下面的命令格式化输出,所以这种方式我用的不多: set linesize 150 set pagesize 500 col PLANLINE for a120 SELECT EXECORD EXEC_ORDER, PLANLINE FROM (SELECT PLANLINE, ROWNUM EXECORD, ID, RID FROM (SELECT PLANLINE, ID, RID, LEV FROM (SELECT lpad(‘ ‘,2*(LEVEL),rpad(‘ ‘,80,’ ‘))|| OPERATION||’ ‘|| Operation DECODE(OPTIONS,NULL,”,'(‘||OPTIONS || ‘) ‘)|| Options DECODE(OBJECT_OWNER,null,”,’OF ”’|| OBJECT_OWNER||’。
‘)|| Owner DECODE(OBJECT_NAME,null,”,OBJECT_NAME|| ”’ ‘)|| Object Name DECODE(OBJECT_TYPE,null,”,'(‘||OBJECT_TYPE|| ‘) ‘)|| Object Type DECODE(ID,0,’OPT_MODE:’)|| Optimizer DECODE(OPTIMIZER,null,”,’ANALYZED’,”, OPTIMIZER)|| DECODE(NVL(COST,0)+NVL(CARDINALITY,0)+NVL(BYTES,0), 0,null,’ (COST=’||TO_CHAR(COST)||’,CARD=’|| TO_CHAR(CARDINALITY)||’,BYTES=’||TO_CHAR(BYTES)||’)’) PLANLINE, ID, LEVEL LEV, (SELECT MAX(ID) FROM PLAN_TABLE PL2 CONNECT BY PRIOR ID = PARENT_ID AND PRIOR STATEMENT_ID = STATEMENT_ID START WITH ID = PL1。 ID AND STATEMENT_ID = PL1。
STATEMENT_ID) RID FROM PLAN_TABLE PL1 CONNECT BY PRIOR ID = PARENT_ID AND PRIOR STATEMENT_ID = STATEMENT_ID START WITH ID = 0 AND STATEMENT_ID = ‘aaa’) ORDER BY RID, LEV)) ORDER BY ID; 上面这2种方法只能为在本会话中正在运行的语句产生执行计划,即我们需要已经知道了哪条语句运行的效率很差,我们是有目的只对这条SQL语句去优化。 其实,在很多情况下,我们只会听一个客户抱怨说现在系统运行很慢,而我们不知道是哪个SQL引起的。
此时有许多现成的语句可以找出耗费资源比较多的语句,如: SELECT ADDRESS, substr(SQL_TEXT,1,20) Text, buffer_gets, executions, buffer_gets/executions AVG FROM v$sqlarea WHERE executions>0 AND buffer_gets > 100000 ORDER BY 5; 从而对找出的语句进行进一步优化。 当然我们还可以为一个正在运行的会话中运行的所有SQL语句生成执行计划,这需要对该会话进行跟踪,产生trace文件,然后对该文件用tkprof程序格式化一下,这种得到执行计划的方式很有用,因为它包含其它额外信息,如SQL语句执行的每个阶段(如Parse、Execute、Fetch)分别耗费的各个资源情况(如CPU、DISK、elapsed等)。
3).用dbms_system存储过程生成执行计划 因为使用dbms_system存储过程可以跟踪另一个会话发出的sql语句,并记录所使用的执行计划,而且还提供其它对性能调整有用的信息。因其使用方式与上面2种方式有些不太一样,所以在附录中单独介绍。
这种方法是对SQL进行调整比较有用的方式之一,有些情况下非它不可。 以上是我对于这个问题的解答,希望能够帮到大家。
求SQL语句自动生成器VB源码
不用自己写SQL去数据库存取对象。
你的代码仅仅和对象关联,自动产生SQL语句,并确保对象提交到正确的表和字段中去. 只要设计好数据库自动生成工厂模式的3层结构代码。 http://**downloads92/sourcecode/app/* 这个程序是用来比较csv文件, 然后自动生成sql语句, 运行命令是runGenText csv1 csv2 /* * Created on Aug 31, 2004 * * TODO To change the template for this generated file go to * Window Preferences Java Code Style Code Templates */ import *SVParser; import *ption; import *tFoundException; import *ader; import *tion; import *; import *Manager; import *edStatement; import *eption; import *; /** * @author jmorrey * * TODO To change the template for this generated type comment go to * Window Preferences Java Code Style Code Templates */ public class GenerateGTEXTSQL { public static void main(String[] args) { String srcFile1 = “”; String srcFile2 = “”; FileReader fileRead1 = null; FileReader fileRead2 = null; String[][] srcArray1; String[][] srcArray2; int srcp = 0; int dstp = 0; try{ srcFile1 = args[0]; srcFile2 = args[1]; } catch (Exception exe){ *n(“usage: java GenerateGTEXTSQL [srcFile1] [srcFile2]”); *(1); } try{ fileRead1 = new FileReader(srcFile1); fileRead2 = new FileReader(srcFile2); } catch (FileNotFoundException exception){ *n(“The ” + srcFile1 + ” file is missing from the current working directory.”); *(1); } try{ srcArray1 = *(fileRead1); srcArray2 = *(fileRead2); int len1 = *; int len2 = *; //for (int i=0;i