Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
suliangchun
dbeaver
提交
dfb3c81b
D
dbeaver
项目概览
suliangchun
/
dbeaver
与 Fork 源项目一致
从无法访问的项目Fork
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dbeaver
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
dfb3c81b
编写于
2月 18, 2019
作者:
S
Serge Rider
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Plan: cost/duaration, layout and rendering fix
上级
cf3369ab
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
168 addition
and
26 deletion
+168
-26
plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/model/plan/MySQLPlanAnalyser.java
...jkiss/dbeaver/ext/mysql/model/plan/MySQLPlanAnalyser.java
+58
-7
plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/model/plan/MySQLPlanNode.java
...org/jkiss/dbeaver/ext/mysql/model/plan/MySQLPlanNode.java
+22
-17
plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/model/plan/MySQLPlanNodeJoin.java
...jkiss/dbeaver/ext/mysql/model/plan/MySQLPlanNodeJoin.java
+45
-0
plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/model/plan/OraclePlanAnalyser.java
...iss/dbeaver/ext/oracle/model/plan/OraclePlanAnalyser.java
+14
-0
plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/model/plan/OraclePlanNode.java
...g/jkiss/dbeaver/ext/oracle/model/plan/OraclePlanNode.java
+23
-2
plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/exec/plan/DBCPlanCostNode.java
...rc/org/jkiss/dbeaver/model/exec/plan/DBCPlanCostNode.java
+2
-0
plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/plan/AbstractExecutionPlan.java
.../jkiss/dbeaver/model/impl/plan/AbstractExecutionPlan.java
+4
-0
未找到文件。
plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/model/plan/MySQLPlanAnalyser.java
浏览文件 @
dfb3c81b
...
...
@@ -22,13 +22,11 @@ import org.jkiss.dbeaver.model.exec.DBCSession;
import
org.jkiss.dbeaver.model.exec.jdbc.JDBCPreparedStatement
;
import
org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet
;
import
org.jkiss.dbeaver.model.exec.jdbc.JDBCSession
;
import
org.jkiss.dbeaver.model.exec.plan.DBCPlanNode
;
import
org.jkiss.dbeaver.model.impl.plan.AbstractExecutionPlan
;
import
org.jkiss.dbeaver.model.sql.SQLUtils
;
import
java.sql.SQLException
;
import
java.util.ArrayList
;
import
java.util.Collection
;
import
java.util.List
;
/**
...
...
@@ -38,7 +36,7 @@ public class MySQLPlanAnalyser extends AbstractExecutionPlan {
private
MySQLDataSource
dataSource
;
private
String
query
;
private
List
<
DBC
PlanNode
>
rootNodes
;
private
List
<
MySQL
PlanNode
>
rootNodes
;
public
MySQLPlanAnalyser
(
MySQLDataSource
dataSource
,
String
query
)
{
...
...
@@ -58,7 +56,7 @@ public class MySQLPlanAnalyser extends AbstractExecutionPlan {
}
@Override
public
Collection
<
DBC
PlanNode
>
getPlanNodes
()
public
List
<
MySQL
PlanNode
>
getPlanNodes
()
{
return
rootNodes
;
}
...
...
@@ -79,13 +77,66 @@ public class MySQLPlanAnalyser extends AbstractExecutionPlan {
MySQLPlanNode
node
=
new
MySQLPlanNode
(
null
,
dbResult
);
nodes
.
add
(
node
);
}
MySQLPlanNode
rootNode
=
new
MySQLPlanNode
(
nodes
);
rootNodes
=
new
ArrayList
<>();
rootNodes
.
add
(
rootNode
);
rootNodes
=
convertToPlanTree
(
nodes
);
}
}
}
catch
(
SQLException
e
)
{
throw
new
DBCException
(
e
,
session
.
getDataSource
());
}
}
private
List
<
MySQLPlanNode
>
convertToPlanTree
(
List
<
MySQLPlanNode
>
srcNodes
)
{
List
<
MySQLPlanNode
>
roots
=
new
ArrayList
<>();
if
(
srcNodes
.
size
()
==
1
)
{
// Just one node
roots
.
add
(
srcNodes
.
get
(
0
));
}
else
{
List
<
MySQLPlanNode
>
parsed
=
new
ArrayList
<>();
for
(
int
id
=
1
;
;
id
++)
{
List
<
MySQLPlanNode
>
nodes
=
getQueriesById
(
srcNodes
,
id
);
if
(
nodes
.
isEmpty
())
{
break
;
}
if
(
nodes
.
size
()
==
1
)
{
roots
.
add
(
nodes
.
get
(
0
));
}
else
{
roots
.
add
(
joinNodes
(
srcNodes
,
nodes
));
}
parsed
.
addAll
(
nodes
);
}
// Add the rest
for
(
MySQLPlanNode
node
:
srcNodes
)
{
if
(!
parsed
.
contains
(
node
))
{
roots
.
add
(
node
);
}
}
}
return
roots
;
}
private
List
<
MySQLPlanNode
>
getQueriesById
(
List
<
MySQLPlanNode
>
srcNodes
,
int
id
)
{
List
<
MySQLPlanNode
>
subList
=
new
ArrayList
<>();
for
(
MySQLPlanNode
node
:
srcNodes
)
{
if
(
node
.
getId
()
!=
null
&&
node
.
getId
()
==
id
)
{
subList
.
add
(
node
);
}
}
return
subList
;
}
private
MySQLPlanNode
joinNodes
(
List
<
MySQLPlanNode
>
srcNodes
,
List
<
MySQLPlanNode
>
nodes
)
{
MySQLPlanNode
result
=
null
;
MySQLPlanNode
leftNode
=
nodes
.
get
(
0
);
for
(
int
i
=
1
;
i
<
nodes
.
size
();
i
++)
{
leftNode
=
new
MySQLPlanNodeJoin
(
leftNode
.
getParent
(),
leftNode
,
nodes
.
get
(
i
));
if
(
result
==
null
)
{
result
=
leftNode
;
}
}
return
result
;
}
}
plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/model/plan/MySQLPlanNode.java
浏览文件 @
dfb3c81b
...
...
@@ -30,20 +30,20 @@ import java.util.List;
*/
public
class
MySQLPlanNode
extends
AbstractExecutionPlanNode
implements
DBCPlanCostNode
{
pr
ivate
long
id
;
pr
ivate
String
selectType
;
pr
ivate
String
table
;
pr
ivate
String
type
;
pr
ivate
String
possibleKeys
;
pr
ivate
String
key
;
pr
ivate
String
keyLength
;
pr
ivate
String
ref
;
pr
ivate
long
rowCount
;
pr
ivate
double
filtered
;
pr
ivate
String
extra
;
pr
ivate
MySQLPlanNode
parent
;
pr
ivate
List
<
MySQLPlanNode
>
nested
;
pr
otected
Integer
id
;
pr
otected
String
selectType
;
pr
otected
String
table
;
pr
otected
String
type
;
pr
otected
String
possibleKeys
;
pr
otected
String
key
;
pr
otected
String
keyLength
;
pr
otected
String
ref
;
pr
otected
long
rowCount
;
pr
otected
double
filtered
;
pr
otected
String
extra
;
pr
otected
MySQLPlanNode
parent
;
pr
otected
List
<
MySQLPlanNode
>
nested
;
public
MySQLPlanNode
(
List
<
MySQLPlanNode
>
nodes
)
{
// Root node
...
...
@@ -56,7 +56,7 @@ public class MySQLPlanNode extends AbstractExecutionPlanNode implements DBCPlanC
public
MySQLPlanNode
(
MySQLPlanNode
parent
,
ResultSet
dbResult
)
{
this
.
parent
=
parent
;
this
.
id
=
JDBCUtils
.
safeGet
Long
(
dbResult
,
"id"
);
this
.
id
=
JDBCUtils
.
safeGet
Integer
(
dbResult
,
"id"
);
this
.
selectType
=
JDBCUtils
.
safeGetString
(
dbResult
,
"select_type"
);
this
.
table
=
JDBCUtils
.
safeGetString
(
dbResult
,
"table"
);
this
.
type
=
JDBCUtils
.
safeGetString
(
dbResult
,
"type"
);
...
...
@@ -69,8 +69,13 @@ public class MySQLPlanNode extends AbstractExecutionPlanNode implements DBCPlanC
this
.
extra
=
JDBCUtils
.
safeGetString
(
dbResult
,
"extra"
);
}
public
MySQLPlanNode
(
MySQLPlanNode
parent
,
String
type
)
{
this
.
parent
=
parent
;
this
.
type
=
type
;
}
@Override
public
DBC
PlanNode
getParent
()
{
public
MySQL
PlanNode
getParent
()
{
return
parent
;
}
...
...
@@ -96,7 +101,7 @@ public class MySQLPlanNode extends AbstractExecutionPlanNode implements DBCPlanC
}
@Property
(
order
=
0
,
viewable
=
true
)
public
long
getId
()
{
public
Integer
getId
()
{
return
id
;
}
...
...
plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/model/plan/MySQLPlanNodeJoin.java
0 → 100644
浏览文件 @
dfb3c81b
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
org.jkiss.dbeaver.ext.mysql.model.plan
;
import
org.jkiss.dbeaver.model.exec.plan.DBCPlanCostNode
;
import
org.jkiss.dbeaver.model.exec.plan.DBCPlanNode
;
import
org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils
;
import
org.jkiss.dbeaver.model.impl.plan.AbstractExecutionPlanNode
;
import
org.jkiss.dbeaver.model.meta.Property
;
import
java.sql.ResultSet
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* MySQL execution plan node
*/
public
class
MySQLPlanNodeJoin
extends
MySQLPlanNode
{
public
MySQLPlanNodeJoin
(
MySQLPlanNode
parent
,
MySQLPlanNode
left
,
MySQLPlanNode
right
)
{
super
(
parent
,
"JOIN"
);
this
.
id
=
left
.
id
;
this
.
nested
=
new
ArrayList
<>(
2
);
this
.
nested
.
add
(
left
);
this
.
nested
.
add
(
right
);
left
.
parent
=
this
;
right
.
parent
=
this
;
}
}
plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/model/plan/OraclePlanAnalyser.java
浏览文件 @
dfb3c81b
...
...
@@ -23,6 +23,7 @@ import org.jkiss.dbeaver.model.exec.DBCException;
import
org.jkiss.dbeaver.model.exec.jdbc.JDBCPreparedStatement
;
import
org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet
;
import
org.jkiss.dbeaver.model.exec.jdbc.JDBCSession
;
import
org.jkiss.dbeaver.model.exec.plan.DBCPlanCostNode
;
import
org.jkiss.dbeaver.model.impl.plan.AbstractExecutionPlan
;
import
org.jkiss.utils.IntKeyMap
;
import
org.jkiss.utils.SecurityUtils
;
...
...
@@ -55,6 +56,19 @@ public class OraclePlanAnalyser extends AbstractExecutionPlan {
this
.
query
=
query
;
}
@Override
public
Object
getPlanFeature
(
String
feature
)
{
if
(
DBCPlanCostNode
.
FEATURE_PLAN_COST
.
equalsIgnoreCase
(
feature
)
|
DBCPlanCostNode
.
FEATURE_PLAN_DURATION
.
equalsIgnoreCase
(
feature
))
{
return
true
;
}
else
if
(
DBCPlanCostNode
.
PLAN_DURATION_MEASURE
.
equals
(
feature
))
{
return
"KC"
;
}
return
super
.
getPlanFeature
(
feature
);
}
@Override
public
String
getQueryString
()
{
...
...
plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/model/plan/OraclePlanNode.java
浏览文件 @
dfb3c81b
...
...
@@ -20,6 +20,7 @@ import org.jkiss.dbeaver.DBException;
import
org.jkiss.dbeaver.ext.oracle.model.OracleDataSource
;
import
org.jkiss.dbeaver.ext.oracle.model.OracleObjectType
;
import
org.jkiss.dbeaver.ext.oracle.model.OracleTablePhysical
;
import
org.jkiss.dbeaver.model.exec.plan.DBCPlanCostNode
;
import
org.jkiss.dbeaver.model.exec.plan.DBCPlanNode
;
import
org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils
;
import
org.jkiss.dbeaver.model.impl.plan.AbstractExecutionPlanNode
;
...
...
@@ -38,7 +39,7 @@ import java.util.List;
/**
* Oracle execution plan node
*/
public
class
OraclePlanNode
extends
AbstractExecutionPlanNode
{
public
class
OraclePlanNode
extends
AbstractExecutionPlanNode
implements
DBCPlanCostNode
{
private
final
OracleDataSource
dataSource
;
private
String
statementId
;
...
...
@@ -197,7 +198,7 @@ public class OraclePlanNode extends AbstractExecutionPlanNode {
@Property
(
order
=
5
,
viewable
=
true
,
supportsPreview
=
true
)
public
Object
getObject
(
DBRProgressMonitor
monitor
)
throws
DBException
{
if
(
monitor
==
null
||
CommonUtils
.
isEmpty
(
objectOwner
))
{
if
(
monitor
==
null
||
CommonUtils
.
isEmpty
(
objectOwner
)
||
CommonUtils
.
isEmpty
(
objectName
)
)
{
return
objectName
==
null
?
""
:
objectName
;
}
String
objectTypeName
=
objectType
;
...
...
@@ -329,4 +330,24 @@ public class OraclePlanNode extends AbstractExecutionPlanNode {
{
return
operation
+
" "
+
CommonUtils
.
toString
(
options
)
+
" "
+
CommonUtils
.
toString
(
objectName
);
}
@Override
public
Number
getNodeCost
()
{
return
cost
;
}
@Override
public
Number
getNodePercent
()
{
return
null
;
}
@Override
public
Number
getNodeDuration
()
{
return
(
double
)
cpuCost
/
1000
;
}
@Override
public
Number
getNodeRowCount
()
{
return
cardinality
;
}
}
plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/exec/plan/DBCPlanCostNode.java
浏览文件 @
dfb3c81b
...
...
@@ -26,6 +26,8 @@ public interface DBCPlanCostNode extends DBCPlanNode {
String
FEATURE_PLAN_ROWS
=
"plan.rows"
;
String
FEATURE_PLAN_DURATION
=
"plan.duration"
;
String
PLAN_DURATION_MEASURE
=
"plan.duration.measure"
;
Number
getNodeCost
();
Number
getNodePercent
();
...
...
plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/plan/AbstractExecutionPlan.java
浏览文件 @
dfb3c81b
...
...
@@ -18,6 +18,7 @@
package
org.jkiss.dbeaver.model.impl.plan
;
import
org.jkiss.dbeaver.model.exec.plan.DBCPlan
;
import
org.jkiss.dbeaver.model.exec.plan.DBCPlanCostNode
;
/**
* Abstract execution plan
...
...
@@ -25,6 +26,9 @@ import org.jkiss.dbeaver.model.exec.plan.DBCPlan;
public
abstract
class
AbstractExecutionPlan
implements
DBCPlan
{
public
Object
getPlanFeature
(
String
feature
)
{
if
(
DBCPlanCostNode
.
PLAN_DURATION_MEASURE
.
equals
(
feature
))
{
return
"ms"
;
}
return
null
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录