最近写个程序,遍历所有日志中的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="1"; ...
文章目录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);
这将显示查询的
执行计划
信息,包括访问方法、连接顺序、索引使用情况等。通过分析
执行计划
,你可以了解查询的性能瓶颈,并根据需要进行优化。
需要注意的是,
执行计划
是一种近似估算,实际
执行
中可能会有一些微小的差异。因此,在优化查询性能时,最好使用实际的
执行计划
和性能统计信息进行分析。