解决DBeaver无法查看MySQL执行计划问题
DBeaver这个数据库连接工具的确很好用,但是最近在使用时发现它不能查看MySQL的执行计划
explain execute select * from table;
explain select * from table;
/**点 解析执行计划按钮*/
explain extended select * from table
提示内容为:“sql is not a supported statement”
经过查看DBeaver的源码找到了如下代码
public class MySQLDataSource extends JDBCDataSource implements DBSObjectSelector, DBCQueryPlanner {
@Override
protected Connection openConnection(@NotNull DBRProgressMonitor monitor, JDBCRemoteInstance remoteInstance, @NotNull String purpose)
throws DBCException {
Connection mysqlConnection = super.openConnection(monitor, remoteInstance, purpose);
if (!getContainer().getPreferenceStore().getBoolean(ModelPreferences.META_CLIENT_NAME_DISABLE)) {
// Provide client info
try {
// 注意这一行设置了 ApplicationName 信息
mysqlConnection.setClientInfo("ApplicationName", DBUtils.getClientApplicationName(getContainer(), purpose));
} catch (Throwable e) {
// just ignore
log.debug(e);
}
}
return mysqlConnection;
}
}
注意这行代码
mysqlConnection.setClientInfo("ApplicationName", DBUtils.getClientApplicationName(getContainer(), purpose));
该行代码设置了 ApplicationName 属性,设置该属性后,发送给服务端的SQL前面都会带上一个类似于 “/* ApplicationName=DBeaver 5.1.4 - Main */ ”的信息,这个信息会导致数据库抛出“sql is not a supported statement”
解决思路:
不设置 ApplicationName,即 getContainer().getPreferenceStore().getBoolean(ModelPreferences.META_CLIENT_NAME_DISABLE) 结果为 true,让 if 的判断结果为 false ,这样就跳过了设置语句。 经查找相关配置项,发现 META_CLIENT_NAME_DISABLE 为“禁用客户端身份识别”。
解决方案:
在【首选项->数据库->连接】中勾选“禁用客户端身份识别”
禁用以后再SQL编辑器中执行 explain execute select ... 就可以查看执行计划了
注:点击【解析执行计划】按钮后,DBeaver生成的执行计划语句为:explain extended select ...,extended关键字在某些MySQL版本(例如:MySQL 5.6.29)中已经不被支持