jdbc 执行explain plan set 输出执行计划

最近写个程序,遍历所有日志中的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>&quot;ATTENDENCE_ACCOUNTS&quot;.&quot;ID&quot;[NUMBER,22], &quot;ATTENDENCE_ACCOUNTS&quot;.&quot;VERSION&quot;[NUMBER,22], &quot;ATTENDENCE_ACCOUNTS&quot;.&quot;CREATE_STAFF_ID&quot;[NUMBER,22], &quot;ATTENDENCE_ACCOUNTS&quot;.&quot;CREATE_TIME&quot;[TIMESTAMP,11], &quot;ATTENDENCE_ACCOUNTS&quot;.&quot;DELETE_STAFF_ID&quot;[NUMBER,22], &quot;ATTENDENCE_ACCOUNTS&quot;.&quot;DELETE_TIME&quot;[TIMESTAMP,11], &quot;ATTENDENCE_ACCOUNTS&quot;.&quot;MODIFY_STAFF_ID&quot;[NUMBER,22], &quot;ATTENDENCE_ACCOUNTS&quot;.&quot;MODIFY_TIME&quot;[TIMESTAMP,11], &quot;ATTENDENCE_ACCOUNTS&quot;.&quot;VALID&quot;[NUMBER,22], &quot;ATTENDENCE_ACCOUNTS&quot;.&quot;CID&quot;[NUMBER,22], &quot;ATTENDENCE_ACCOUNTS&quot;.&quot;CREATE_DEPARTMENT_ID&quot;[NUMBER,22], &quot;ATTENDENCE_ACCOUNTS&quot;.&quot;CREATE_POSITION_ID&quot;[NUMBER,22], &quot;ATTENDENCE_ACCOUNTS&quot;.&quot;EFFECT_STAFF_ID&quot;[NUMBER,22], &quot;ATTENDENCE_ACCOUNTS&quot;.&quot;EFFECT_TIME&quot;[TIMESTAMP,11], &quot;ATTENDENCE_ACCOUNTS&quot;.&quot;OWNER_DEPARTMENT_ID&quot;[NUMBER,22], &quot;ATTENDENCE_ACCOUNTS&quot;.&quot;OWNER_POSITION_ID&quot;[NUMBER,22], &quot;ATTENDENCE_ACCOUNTS&quot;.&quot;OWNER_STAFF_ID&quot;[NUMBER,22], &quot;ATTENDENCE_ACCOUNTS&quot;.&quot;POSITION_LAY_REC&quot;[VARCHAR2,1020], &quot;ATTENDENCE_ACCOUNTS&quot;.&quot;STATUS&quot;[NUMBER,22], &quot;ATTENDENCE_ACCOUNTS&quot;.&quot;TABLE_NO&quot;[VARCHAR2,1020], &quot;ATTENDENCE_ACCOUNTS&quot;.&quot;ACC_MODEL&quot;[VARCHAR2,1020], &quot;ATTENDENCE_ACCOUNTS&quot;.&quot;ACC_TIME&quot;[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>

猜你喜欢

转载自wangting424.iteye.com/blog/1550747