最近写个程序,遍历所有日志中的
sql语句,返回含有全表扫描的sql,用explain plan set 简单实现,
执行计划分析格式没看懂,只能sql拷贝出来青蛙中执行,不过还是比以前方便多了
public static void main(String[] args) throws Exception {
String id="1";
1. explain planfor获取(类似plsql中的f5)
Step1; explain plan for “sql”
Step2: select * from table(dbms_xplan.display)
SQL> set linesize 200
SQL> set pagesize 20000
SQL> explain plan for select count(*) fr
SQL查询语句的性能从一定程度上影响整个数据库的性能。很多情况下,数据库性能的低下差不多都是不良SQL语句所引起。而SQL语句的执行
计划则决定了SQL语句将会采用何种方式从数据库提取数据并返回给客户端,本文描述的将是如何通过EXPLAIN PLAN 获取SQL语句执行计划来获
取SQL语句的执行计划。
一、获取SQL语句执行计划的方式
1. 使用explai...
SQL的执行计划实际代表了目标SQL在Oracle数据库内部的具体执行步骤,作为调优,只有知道了优化器选择的执行计划是否为当前情形下最优的执行计划,才能够知道下一步往什么方向。
执行计划的定义:执行目标SQL的所有步骤的组合。
我们首先列出查看执行计划的一些常用方法:
explain plan命令
PL/SQL Developer中通过快捷键F5就可以查看目标SQ
文章目录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语句的。分析查...
MyBatis-Plus并没有直接集成Neo4j JDBC驱动,但是可以通过MyBatis-Plus提供的自定义SQL执行器来使用Neo4j JDBC驱动。
首先需要在项目中引入Neo4j JDBC驱动的依赖,可以在Maven中添加以下依赖:
```xml
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-jdbc-driver</artifactId>
<version>4.3.1</version>
</dependency>
然后在MyBatis-Plus的配置类中配置自定义SQL执行器,示例如下:
```java
@Configuration
public class MybatisPlusConfig {
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return configuration -> {
// 添加自定义SQL执行器
configuration.addInterceptor(new MyNeo4jJdbcInterceptor());
* 自定义SQL执行器,使用Neo4j JDBC驱动执行SQL
private static class MyNeo4jJdbcInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 获取MappedStatement和参数
MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
Object parameter = invocation.getArgs()[1];
// 获取SQL语句
BoundSql boundSql = mappedStatement.getBoundSql(parameter);
String sql = boundSql.getSql();
// 使用Neo4j JDBC驱动执行SQL
try (Connection connection = DriverManager.getConnection("jdbc:neo4j:bolt://localhost:7687", "neo4j", "password");
PreparedStatement statement = connection.prepareStatement(sql)) {
// 设置参数
ParameterHandler parameterHandler = new DefaultParameterHandler(mappedStatement, parameter, boundSql);
parameterHandler.setParameters(statement);
// 执行SQL
if (mappedStatement.getResultSetType() == ResultSetType.DEFAULT) {
statement.execute();
} else {
throw new RuntimeException("Unsupported result set type: " + mappedStatement.getResultSetType());
// 返回结果
ResultSet resultSet = statement.getResultSet();
return new MyResultSet(resultSet);
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
@Override
public void setProperties(Properties properties) {
// do nothing
* 自定义ResultSet,用于包装Neo4j JDBC驱动返回的ResultSet
private static class MyResultSet implements ResultSet {
private final ResultSet resultSet;
public MyResultSet(ResultSet resultSet) {
this.resultSet = resultSet;
// 实现ResultSet接口的方法,用于包装Neo4j JDBC驱动返回的ResultSet
// ...
以上代码中,`MyNeo4jJdbcInterceptor`是自定义的SQL执行器,使用Neo4j JDBC驱动执行SQL。在`intercept`方法中,获取SQL语句和参数,使用Neo4j JDBC驱动执行SQL,并将返回的`ResultSet`包装为`MyResultSet`返回。
需要注意的是,自定义SQL执行器需要添加到MyBatis-Plus的配置中,这里使用了`ConfigurationCustomizer`实现。同时,由于Neo4j JDBC驱动返回的`ResultSet`和MyBatis-Plus默认的`ResultSet`不同,需要自定义`MyResultSet`实现`ResultSet`接口,用于包装Neo4j JDBC驱动返回的`ResultSet`。