Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
2c02bfac
C
ClickHouse
项目概览
2dot5
/
ClickHouse
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
ClickHouse
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
2c02bfac
编写于
6月 26, 2020
作者:
N
Nikolai Kochetov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Compact pipeline.
上级
f4e944cd
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
183 addition
and
8 deletion
+183
-8
src/Interpreters/InterpreterExplainQuery.cpp
src/Interpreters/InterpreterExplainQuery.cpp
+6
-1
src/Processors/IProcessor.h
src/Processors/IProcessor.h
+2
-2
src/Processors/QueryPipeline.cpp
src/Processors/QueryPipeline.cpp
+2
-3
src/Processors/printPipeline.cpp
src/Processors/printPipeline.cpp
+164
-0
src/Processors/printPipeline.h
src/Processors/printPipeline.h
+8
-2
src/Processors/ya.make
src/Processors/ya.make
+1
-0
未找到文件。
src/Interpreters/InterpreterExplainQuery.cpp
浏览文件 @
2c02bfac
...
...
@@ -130,6 +130,7 @@ struct QueryPipelineSettings
{
QueryPlan
::
ExplainPipelineOptions
query_pipeline_options
;
bool
graph
=
false
;
bool
compact
=
true
;
constexpr
static
char
name
[]
=
"PIPELINE"
;
...
...
@@ -137,6 +138,7 @@ struct QueryPipelineSettings
{
{
"header"
,
query_pipeline_options
.
header
},
{
"graph"
,
graph
},
{
"compact"
,
compact
},
};
};
...
...
@@ -262,7 +264,10 @@ BlockInputStreamPtr InterpreterExplainQuery::executeImpl()
if
(
settings
.
graph
)
{
printPipeline
(
pipeline
->
getProcessors
(),
buffer
);
if
(
settings
.
compact
)
printPipelineCompact
(
pipeline
->
getProcessors
(),
buffer
,
settings
.
query_pipeline_options
.
header
);
else
printPipeline
(
pipeline
->
getProcessors
(),
buffer
);
}
else
{
...
...
src/Processors/IProcessor.h
浏览文件 @
2c02bfac
...
...
@@ -312,8 +312,8 @@ private:
bool
has_quota
=
false
;
IQueryPlanStep
*
query_plan_step
;
size_t
query_plan_step_group
;
IQueryPlanStep
*
query_plan_step
=
nullptr
;
size_t
query_plan_step_group
=
0
;
};
...
...
src/Processors/QueryPipeline.cpp
浏览文件 @
2c02bfac
...
...
@@ -879,12 +879,11 @@ QueryPipelineProcessorsCollector::~QueryPipelineProcessorsCollector()
Processors
QueryPipelineProcessorsCollector
::
detachProcessors
(
size_t
group
)
{
Processors
res
;
res
.
swap
(
processors
);
for
(
auto
&
processor
:
processors
)
processor
->
setQueryPlanStep
(
step
,
group
);
Processors
res
;
res
.
swap
(
processors
);
return
res
;
}
...
...
src/Processors/printPipeline.cpp
0 → 100644
浏览文件 @
2c02bfac
#include <Processors/printPipeline.h>
#include <Processors/QueryPlan/IQueryPlanStep.h>
#include <set>
#include <map>
namespace
DB
{
void
printPipelineCompact
(
const
Processors
&
processors
,
WriteBuffer
&
out
,
bool
with_header
)
{
struct
Node
;
struct
Key
{
size_t
group
;
IQueryPlanStep
*
step
;
std
::
string
name
;
auto
getTuple
()
const
{
return
std
::
forward_as_tuple
(
group
,
step
,
name
);
}
bool
operator
<
(
const
Key
&
other
)
const
{
return
getTuple
()
<
other
.
getTuple
();
}
};
struct
EdgeData
{
Block
header
;
size_t
count
;
};
using
Edge
=
std
::
vector
<
EdgeData
>
;
struct
Node
{
size_t
id
=
0
;
std
::
map
<
Node
*
,
Edge
>
edges
=
{};
std
::
vector
<
const
IProcessor
*>
agents
=
{};
};
std
::
map
<
Key
,
Node
>
graph
;
auto
get_key
=
[](
const
IProcessor
&
processor
)
{
return
Key
{
processor
.
getQueryPlanStepGroup
(),
processor
.
getQueryPlanStep
(),
processor
.
getName
()};
};
for
(
const
auto
&
processor
:
processors
)
{
auto
res
=
graph
.
emplace
(
get_key
(
*
processor
),
Node
());
res
.
first
->
second
.
agents
.
emplace_back
(
processor
.
get
());
if
(
res
.
second
)
res
.
first
->
second
.
id
=
graph
.
size
();
}
Block
empty_header
;
for
(
const
auto
&
processor
:
processors
)
{
auto
&
from
=
graph
[
get_key
(
*
processor
)];
for
(
auto
&
port
:
processor
->
getOutputs
())
{
if
(
!
port
.
isConnected
())
continue
;
auto
&
to
=
graph
[
get_key
(
port
.
getInputPort
().
getProcessor
())];
auto
&
edge
=
from
.
edges
[
&
to
];
const
auto
&
header
=
with_header
?
port
.
getHeader
()
:
empty_header
;
bool
found
=
false
;
for
(
auto
&
item
:
edge
)
{
if
(
blocksHaveEqualStructure
(
header
,
item
.
header
))
{
found
=
true
;
++
item
.
count
;
break
;
}
}
if
(
!
found
)
edge
.
emplace_back
(
EdgeData
{
header
,
1
});
}
}
std
::
map
<
IQueryPlanStep
*
,
std
::
vector
<
const
Node
*>>
steps_map
;
for
(
const
auto
&
item
:
graph
)
steps_map
[
item
.
first
.
step
].
emplace_back
(
&
item
.
second
);
out
<<
"digraph
\n
{
\n
"
;
out
<<
" rankdir=
\"
LR
\"
;
\n
"
;
out
<<
" { node [shape = box]
\n
"
;
/// Nodes // TODO quoting and escaping
size_t
next_step
=
0
;
for
(
const
auto
&
item
:
steps_map
)
{
if
(
item
.
first
!=
nullptr
)
{
out
<<
" subgraph cluster_"
<<
next_step
<<
" {
\n
"
;
out
<<
" label =
\"
"
<<
item
.
first
->
getName
()
<<
"
\"
;
\n
"
;
out
<<
" style=filled;
\n
"
;
out
<<
" color=lightgrey;
\n
"
;
out
<<
" node [style=filled,color=white];
\n
"
;
out
<<
" { rank = same;
\n
"
;
++
next_step
;
}
for
(
const
auto
&
node
:
item
.
second
)
{
const
auto
&
processor
=
node
->
agents
.
front
();
out
<<
" n"
<<
node
->
id
<<
" [label=
\"
"
<<
processor
->
getName
();
if
(
node
->
agents
.
size
()
>
1
)
out
<<
" x "
<<
node
->
agents
.
size
();
const
auto
&
description
=
processor
->
getDescription
();
if
(
!
description
.
empty
())
out
<<
' '
<<
description
;
out
<<
"
\"
];
\n
"
;
}
if
(
item
.
first
!=
nullptr
)
{
out
<<
" }
\n
"
;
out
<<
" }
\n
"
;
}
}
out
<<
" }
\n
"
;
/// Edges
for
(
const
auto
&
item
:
graph
)
{
for
(
const
auto
&
edge
:
item
.
second
.
edges
)
{
for
(
const
auto
&
data
:
edge
.
second
)
{
out
<<
" n"
<<
item
.
second
.
id
<<
" -> "
<<
"n"
<<
edge
.
first
->
id
<<
" [label=
\"
"
;
if
(
data
.
count
>
1
)
out
<<
"x "
<<
data
.
count
;
if
(
with_header
)
{
for
(
const
auto
&
elem
:
data
.
header
)
{
out
<<
"
\n
"
;
elem
.
dumpStructure
(
out
);
}
}
out
<<
"
\"
];
\n
"
;
}
}
}
out
<<
"}
\n
"
;
}
}
src/Processors/printPipeline.h
浏览文件 @
2c02bfac
...
...
@@ -15,6 +15,8 @@ template <typename Processors, typename Statuses>
void
printPipeline
(
const
Processors
&
processors
,
const
Statuses
&
statuses
,
WriteBuffer
&
out
)
{
out
<<
"digraph
\n
{
\n
"
;
out
<<
" rankdir=
\"
LR
\"
;
\n
"
;
out
<<
" { node [shape = box]
\n
"
;
auto
get_proc_id
=
[](
const
IProcessor
&
proc
)
->
UInt64
{
...
...
@@ -26,7 +28,7 @@ void printPipeline(const Processors & processors, const Statuses & statuses, Wri
/// Nodes // TODO quoting and escaping
for
(
const
auto
&
processor
:
processors
)
{
out
<<
"n"
<<
get_proc_id
(
*
processor
)
<<
"[label=
\"
"
<<
processor
->
getName
()
<<
processor
->
getDescription
();
out
<<
"
n"
<<
get_proc_id
(
*
processor
)
<<
"[label=
\"
"
<<
processor
->
getName
()
<<
processor
->
getDescription
();
if
(
statuses_iter
!=
statuses
.
end
())
{
...
...
@@ -37,6 +39,8 @@ void printPipeline(const Processors & processors, const Statuses & statuses, Wri
out
<<
"
\"
];
\n
"
;
}
out
<<
" }
\n
"
;
/// Edges
for
(
const
auto
&
processor
:
processors
)
{
...
...
@@ -48,7 +52,7 @@ void printPipeline(const Processors & processors, const Statuses & statuses, Wri
const
IProcessor
&
curr
=
*
processor
;
const
IProcessor
&
next
=
port
.
getInputPort
().
getProcessor
();
out
<<
"n"
<<
get_proc_id
(
curr
)
<<
" -> n"
<<
get_proc_id
(
next
)
<<
";
\n
"
;
out
<<
"
n"
<<
get_proc_id
(
curr
)
<<
" -> n"
<<
get_proc_id
(
next
)
<<
";
\n
"
;
}
}
out
<<
"}
\n
"
;
...
...
@@ -60,4 +64,6 @@ void printPipeline(const Processors & processors, WriteBuffer & out)
printPipeline
(
processors
,
std
::
vector
<
IProcessor
::
Status
>
(),
out
);
}
void
printPipelineCompact
(
const
Processors
&
processors
,
WriteBuffer
&
out
,
bool
with_header
);
}
src/Processors/ya.make
浏览文件 @
2c02bfac
...
...
@@ -105,6 +105,7 @@ SRCS(
OffsetTransform.cpp
Pipe.cpp
Port.cpp
printPipeline.cpp
QueryPipeline.cpp
ResizeProcessor.cpp
Sources/DelayedSource.cpp
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录