最近写个程序,遍历所有日志中的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);
输出结果:
<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> 最近写个程序,遍历所有日志中的sql语句,返回含有全表扫描的sql,用explain plan set 简单实现,执行计划分析格式没看懂,只能sql拷贝出来青蛙中执行,不过还是比以前方便多了源码: public static void main(String[] args) throws Exception { String id=&quot;1&quot;; ...
文章目录1、概念2、 explain 能干什么3、使用方式4、准备工作5、各字段解释5.1、id5.2、select_type5.3、table5.4、type5.5、possible_keys5.6、key5.7、key_len5.8、ref5.9 rows5.10、Extra 使用 explain 关键字可以模拟优化器 执行 SQL查询 语句 ,从而知道MySQL是如何处理你的SQL 语句 的。分析查...
1、解释一下单列索引和联合索引 单列索引是指在表的某一列上创建索引,联合索引是在多个列上联合创建索引。单列索引可以出现在where条件的任何位置,而联合索引需要按照一定的顺序来写。在多条件查询的时候,联合索引的效率更高,我们联合索引也最多创建两列。 我们创建索引的时候也得考虑到我们这张表的更新频率,如果表里索引比较多的话是比较影响更新速度的,因为创建索引的过程其实就是构建一个二叉树,而每次更新完数据都得重新计算二叉树,所以就影响更新速度。 索引并不是时时都会生效的,比如以下几种情况就能导致索引失效: 对于sql 执行 的小量高低.我们可以通过 执行计划 的信息基本上可以进行分析查看该SQL 语句 执行 的时间.连接顺序及浪费的数据库资源等信息,从而判断该SQL 语句 执行 的效率如何,下面就简单的介绍一下 执行计划 的使用 2. Explain 使用 Oracle RDBMS 执行 每一条SQL 语句 ,都必须经...
Oracle 执行计划 得到 执行计划 的方式Autotrace例子使用 Explain explain p lan set STATEMENT_ID='testp lan ' for select * from dual;select lpad(' ',5*(level-1))||operation operation, options, object_name, cost,position
最近项目换用SpringMVC + Spring Jdbc Template,没有用orm,发现 执行 的sql无法打印出来,查了下解决办法。 在log4j.properties增加如下配置: log4j.logger.org.springframework. jdbc .core. Jdbc Template=debug 注意:这个日志级别只能配置为debug。一如ibatis中想打印sql时也
选中具体的sql,默认按F5 就可以看到 执行计划 explain p lan explain p lan set statement_id=' explain _tmp_t0_tmp_t1' select t0.*,t1.* from tmp_t...
ORACLE 数据库中,需要对SQL 语句 进行优化的话需要知道其 执行计划 ,从而针对性的进行调整. ORACLE 执行计划 的获得有几种方法,下面就来总结下 1、 EXPLAIN 的使用 Oracle RDBMS 执行 每一条SQL 语句 ,都必须经过 Oracle 优化器的评估。所以,了解优化器是如何选择(搜索)路径以及索引是如何被使用的,对优化SQL 语句 有很大的帮助。 Explain 可以用来迅速方便地查出对
EXPLAIN P LAN ############################################################################################### $ ORACLE _HOME/rdbms/admin/utlxp lan .sql (UNIX)  脚本生成一个表这个程序会创建一个名为p lan _table的表
1.SQL 语句 执行计划 使用 EXPLAIN P LAN 语句 来确定 Oracle 数据库下指定SQL 语句 执行计划 ,这个 语句 插入每一步 执行计划 的行描述到指定表中。你也可使用 EXPLAIN P LAN 语句 作为SQL跟踪工具的一部分。 EXPLAIN P LAN 命令的语法如下: EXPLAIN P LAN [ SET STATEMENT_ID = string ] [ INTO [ sche...
Oracle Explain 执行计划 是一个用于评估查询性能的工具。当你 执行 一个查询 语句 时, Oracle 会生成一个查询 执行计划 ,它描述了 Oracle 数据库引擎如何处理查询,并指导数据库选择最佳 执行 路径。 你可以使用 EXPLAIN P LAN 语句 来获取查询 执行计划 。例如,假设你有一个查询 语句 如下: ```sql SELECT * FROM employees WHERE department_id = 100; 要获取该查询的 执行计划 ,你可以将 EXPLAIN P LAN 语句 与查询 语句 结合使用,如下所示: ```sql EXPLAIN P LAN FOR SELECT * FROM employees WHERE department_id = 100; 执行 以上 语句 后,你可以使用以下 语句 查看 执行计划 : ```sql SELECT * FROM TABLE(DBMS_XP LAN .DISPLAY); 这将显示查询的 执行计划 信息,包括访问方法、连接顺序、索引使用情况等。通过分析 执行计划 ,你可以了解查询的性能瓶颈,并根据需要进行优化。 需要注意的是, 执行计划 是一种近似估算,实际 执行 中可能会有一些微小的差异。因此,在优化查询性能时,最好使用实际的 执行计划 和性能统计信息进行分析。