最近写个程序,遍历所有日志中的sql语句,返回含有全表扫描的sql,用explain plan set 简单实现,执行计划分析格式没看懂,只能sql拷贝出来青蛙中执行,不过还是比以前方便多了
源码:
public static void main(String[] args) throws Exception {
String id="1";
Driver d = (Driver) Class.forName("oracle.jdbc.OracleDriver").newInstance();
Connection conn = d.connect("jdbc:oracle:thin:bap1/1@//192.168.56.11:1521/XE", new Properties());
Statement statement1 = conn.createStatement();
long t1=System.currentTimeMillis();
statement1.execute("explain plan set STATEMENT_ID = '"+ id + "' for " + "select * from ATTENDENCE_ACCOUNTS");
statement1.executeQuery("select to_clob(dbms_xplan.build_plan_xml(statement_id => '"+ id + "')) AS XPLAN FROM dual");
ResultSet resultSet = statement1.getResultSet();
while (resultSet.next()) {
// executionPlan = resultSet.getSQLXML(1).getString();
if (resultSet.getString(1).indexOf("name=\"TABLE ACCESS\" options=\"FULL\"")>0){
System.out.println(resultSet.getString(1));
}
}
System.out.println(System.currentTimeMillis()-t1);
}
输出结果:
<plan>
<operation name="SELECT STATEMENT" id="0" depth="0" pos="2">
<card>31</card>
<bytes>1085</bytes>
<cost>2</cost>
<io_cost>2</io_cost>
<cpu_cost>24791</cpu_cost>
<time>00:00:01 </time>
</operation>
<operation name="TABLE ACCESS" options="FULL" id="1" depth="1" pos="1">
<object>ATTENDENCE_ACCOUNTS</object>
<card>31</card>
<bytes>1085</bytes>
<cost>2</cost>
<io_cost>2</io_cost>
<cpu_cost>24791</cpu_cost>
<time>00:00:01 </time>
<project>"ATTENDENCE_ACCOUNTS"."ID"[NUMBER,22], "ATTENDENCE_ACCOUNTS"."VERSION"[NUMBER,22], "ATTENDENCE_ACCOUNTS"."CREATE_STAFF_ID"[NUMBER,22], "ATTENDENCE_ACCOUNTS"."CREATE_TIME"[TIMESTAMP,11], "ATTENDENCE_ACCOUNTS"."DELETE_STAFF_ID"[NUMBER,22], "ATTENDENCE_ACCOUNTS"."DELETE_TIME"[TIMESTAMP,11], "ATTENDENCE_ACCOUNTS"."MODIFY_STAFF_ID"[NUMBER,22], "ATTENDENCE_ACCOUNTS"."MODIFY_TIME"[TIMESTAMP,11], "ATTENDENCE_ACCOUNTS"."VALID"[NUMBER,22], "ATTENDENCE_ACCOUNTS"."CID"[NUMBER,22], "ATTENDENCE_ACCOUNTS"."CREATE_DEPARTMENT_ID"[NUMBER,22], "ATTENDENCE_ACCOUNTS"."CREATE_POSITION_ID"[NUMBER,22], "ATTENDENCE_ACCOUNTS"."EFFECT_STAFF_ID"[NUMBER,22], "ATTENDENCE_ACCOUNTS"."EFFECT_TIME"[TIMESTAMP,11], "ATTENDENCE_ACCOUNTS"."OWNER_DEPARTMENT_ID"[NUMBER,22], "ATTENDENCE_ACCOUNTS"."OWNER_POSITION_ID"[NUMBER,22], "ATTENDENCE_ACCOUNTS"."OWNER_STAFF_ID"[NUMBER,22], "ATTENDENCE_ACCOUNTS"."POSITION_LAY_REC"[VARCHAR2,1020], "ATTENDENCE_ACCOUNTS"."STATUS"[NUMBER,22], "ATTENDENCE_ACCOUNTS"."TABLE_NO"[VARCHAR2,1020], "ATTENDENCE_ACCOUNTS"."ACC_MODEL"[VARCHAR2,1020], "ATTENDENCE_ACCOUNTS"."ACC_TIME"[DATE,7]</project>
<qblock>SEL$1</qblock>
<object_alias>ATTENDENCE_ACCOUNTS@SEL$1</object_alias>
<other_xml>
<info type="db_version">11.2.0.2</info>
<info type="parse_schema"><![CDATA["BAP1"]]></info>
<info type="plan_hash">2738177799</info>
<info type="plan_hash_2">1344836542</info>
<outline_data>
<hint><![CDATA[FULL(@"SEL$1" "ATTENDENCE_ACCOUNTS"@"SEL$1")]]></hint>
<hint><![CDATA[OUTLINE_LEAF(@"SEL$1")]]></hint>
<hint><![CDATA[ALL_ROWS]]></hint>
<hint><![CDATA[DB_VERSION('11.2.0.2')]]></hint>
<hint><![CDATA[OPTIMIZER_FEATURES_ENABLE('11.2.0.2')]]></hint>
<hint><![CDATA[IGNORE_OPTIM_EMBEDDED_HINTS]]></hint>
</outline_data>
</other_xml>
</operation>
</plan>
分享到:
相关推荐
Oracle的Explain Plan是数据库管理员和开发人员用来分析SQL查询执行计划的重要工具。它能提供关于如何执行SQL语句的详细信息,包括哪些操作(如全表扫描、索引访问等)将被使用,以及这些操作的预计成本、时间及资源...
- `TABLE_NAME` 是存储执行计划信息的目标表,默认为`plan_table`。 - `<sql_statement>` 是要分析执行计划的SQL语句。 例如,如果要分析`select * from t_test;`这条SQL语句的执行计划,可以使用以下命令: ```...
由于PLAN_TABLE中存储的都是EXPLAIN PLAN的输出信息,因此通过编写简单的SELECT语句,就可以获取到完整的执行计划。然而,在Oracle 9i及更高版本中,引入了DBMS_XPLAN函数,这是一个更为便捷和强大的方式,可以直接...
Oracle 中的 explain_plan 是一个强大的分析工具,能够帮助用户了解 SQL 语句的执行计划,通过它可以了解 Oracle 是如何连接表、使用什么方式扫描表(索引扫描或全表扫描)以及使用到的索引名称。下面详细讲解 ...
在Oracle数据库系统中,"explain plan" 是一个关键的工具,用于分析和理解SQL查询的执行计划,也就是数据检索的路径。它可以帮助数据库管理员和开发人员优化查询性能,确保数据库高效运行。以下是对"explain plan ...
在数据库管理领域,Oracle数据库的性能优化是一项至关重要的任务,其中`EXPLAIN PLAN`是数据库管理员和开发人员常用的工具,用于分析SQL查询的执行计划,从而理解查询如何在数据库中运行,找出潜在的性能瓶颈。...
* Explain 语句:使用 Explain 语句可以获取执行计划,例如:Explain Plan Set STATEMENT_ID='testplan' For Select ….. * Autotrace 工具:Autotrace 是 Oracle 提供的一种工具,可以自动跟踪执行计划。 * 其他...
### Oracle Explain Plan详解 #### 一、引言 在Oracle数据库中,查询优化器(Oracle Optimizer)的主要职责是为SQL语句确定最高效的执行计划。优化器通过收集关于数据的统计信息,并利用Oracle数据库的各种特性(如...
在执行计划中,NSET2操作符将被展示为: ```sql #NSET2: [6, 1, 0] #PRJT2: [6, 1, 0]; exp_num(2), is_atom(FALSE) #CSCN2: [6, 1, 0]; INDEX33555457(T1) ``` 3. SLCT2关系的“选择”(select)运算 SLCT2是...
1. 使用EXPLAIN PLAN语句:这是一种常用的方法,用户可以通过执行EXPLAIN PLAN语句,然后查询输出表来获取SQL语句的执行计划。例如,使用EXPLAIN PLAN FOR SELECT语句后,可以查询PLAN_TABLE表来查看具体的执行计划...
其中,Explain 是通过 Execute Plan 语句生成执行计划的,Autotrace 是通过设置 autotrace 参数生成执行计划的。 在 Oracle 中,生成执行计划需要创建一个 Plan_table 表,用于存储执行计划的信息。该表包括了执行...
本文档详细介绍了几种不同的方法来获取SQL语句的执行计划,包括使用autotrace、EXPLAIN PLAN以及DBMS_XPLAN.DISPLAY_CURSOR等。 #### 方法1:使用autotrace查看执行计划 **配置使用autotrace** 为了能够使用...
1. 使用 Explain 语句:Explain 语句可以用来获取执行计划,例如:Explain plan set STATEMENT_ID='testplan' for select * from dual; 2. 使用 Autotrace 语句:Autotrace 语句可以用来获取执行计划,例如:set ...
- **Hive自带的Explain命令**:虽然它不是图形化的,但可以通过输出文本信息来查看执行计划的概要。 - **Hue**:一个流行的Hadoop用户界面,包括一个内置的Hive编辑器,它可以显示执行计划的可视化表示。 - **Tez...
使用 EXPLAIN PLAN 语句可以生成执行计划,该语句的基本语法为: ``` EXPLAIN PLAN [ SET STATEMENT_ID [=] <string literal> ] [ INTO <table_name> ] FOR ``` 其中,STATEMENT_ID 指定了执行计划的名称,如果不...
`EXPLAIN PLAN FOR`命令并不真正执行查询,而是为查询生成一个逻辑执行计划。 4. **查看执行计划**: 为了显示实际的执行计划,我们需要使用`DBMS_XPLAN.DISPLAY`过程。在执行了`EXPLAIN PLAN FOR`后的SQL语句后,...
本文将详细探讨通过explain命令获得的SQL执行计划中包含的各种元素,以便于理解每个部分所代表的具体含义。 首先,当运行explain命令之后,你会得到一个执行计划,这个计划中包含了多个字段,它们分别是id、select_...
同样,与EXPLAIN PLAN相比,AUTOTRACE不仅展示了执行计划,还执行了SQL语句,从而能够提供更加准确的统计信息。 #### 准备工作 为了使用AUTOTRACE,需要进行以下准备工作: 1. **创建PLAN_TABLE** - 每个需要运行...
Oralce 19c执行计划调优学习笔记 1_执行计划.pdf 2_explain plan for.pdf 3_dbms_xplan.display_cursor.pdf 4_执行计划顺序.pdf 5_直方图.pdf