Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
8ff361ed
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,发现更多精彩内容 >>
提交
8ff361ed
编写于
12月 21, 2019
作者:
A
Alexey Milovidov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Optimization of sorting heap
上级
6c03e1e9
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
31 addition
and
19 deletion
+31
-19
dbms/src/Core/SortCursor.h
dbms/src/Core/SortCursor.h
+19
-7
dbms/src/DataStreams/MergeSortingBlockInputStream.cpp
dbms/src/DataStreams/MergeSortingBlockInputStream.cpp
+12
-12
未找到文件。
dbms/src/Core/SortCursor.h
浏览文件 @
8ff361ed
#pragma once
#include <cassert>
#include <vector>
#include <algorithm>
...
...
@@ -210,6 +211,8 @@ struct SortCursorWithCollation
};
/** Allows to fetch data from multiple sort cursors in sorted order (merging sorted data streams).
*/
template
<
typename
Cursor
>
class
SortingHeap
{
...
...
@@ -232,13 +235,15 @@ public:
void
next
()
{
if
(
current
()
->
isValid
())
assert
(
isValid
());
if
(
!
current
()
->
isLast
())
{
current
()
->
next
();
updateTop
Heap
(
queue
.
begin
(),
queue
.
end
()
);
updateTop
(
);
}
else
queue
.
erase
(
queue
.
begin
()
);
removeTop
(
);
}
private:
...
...
@@ -246,15 +251,17 @@ private:
Container
queue
;
/// This is adapted version of the function __sift_down from libc++.
template
<
typename
It
>
static
void
updateTopHeap
(
It
begin
,
It
end
)
/// Why cannot simply use std::priority_queue?
/// - because it doesn't support updating the top element and requires pop and push instead.
void
updateTop
()
{
size_t
size
=
end
-
begin
;
size_t
size
=
queue
.
size
()
;
if
(
size
<
2
)
return
;
size_t
child_idx
=
1
;
It
child_it
=
begin
+
1
;
auto
begin
=
queue
.
begin
();
auto
child_it
=
begin
+
1
;
/// Right child exists and is greater than left child.
if
(
size
>
2
&&
*
child_it
<
*
(
child_it
+
1
))
...
...
@@ -293,6 +300,11 @@ private:
}
while
(
!
(
*
child_it
<
top
));
*
curr_it
=
std
::
move
(
top
);
}
void
removeTop
()
{
std
::
pop_heap
(
queue
.
begin
(),
queue
.
end
());
}
};
}
dbms/src/DataStreams/MergeSortingBlockInputStream.cpp
浏览文件 @
8ff361ed
...
...
@@ -178,9 +178,9 @@ Block MergeSortingBlocksBlockInputStream::readImpl()
template
<
typename
TSortingHeap
>
Block
MergeSortingBlocksBlockInputStream
::
mergeImpl
(
TSortingHeap
&
queue
)
{
size_t
num_columns
=
blocks
[
0
]
.
columns
();
size_t
num_columns
=
header
.
columns
();
MutableColumns
merged_columns
=
blocks
[
0
]
.
cloneEmptyColumns
();
MutableColumns
merged_columns
=
header
.
cloneEmptyColumns
();
/// TODO: reserve (in each column)
/// Take rows from queue in right order and push to 'merged'.
...
...
@@ -189,31 +189,31 @@ Block MergeSortingBlocksBlockInputStream::mergeImpl(TSortingHeap & queue)
{
auto
current
=
queue
.
current
();
/// Append a row from queue.
for
(
size_t
i
=
0
;
i
<
num_columns
;
++
i
)
merged_columns
[
i
]
->
insertFrom
(
*
current
->
all_columns
[
i
],
current
->
pos
);
if
(
queue
.
isValid
())
queue
.
next
();
else
break
;
++
total_merged_rows
;
++
merged_rows
;
/// We don't need more rows because of limit has reached.
if
(
limit
&&
total_merged_rows
==
limit
)
{
auto
res
=
blocks
[
0
].
cloneWithColumns
(
std
::
move
(
merged_columns
));
blocks
.
clear
();
return
res
;
break
;
}
++
merged_rows
;
queue
.
next
();
/// It's enough for current output block but we will continue.
if
(
merged_rows
==
max_merged_block_size
)
return
blocks
[
0
].
cloneWithColumns
(
std
::
move
(
merged_columns
))
;
break
;
}
if
(
merged_rows
==
0
)
return
{};
return
blocks
[
0
]
.
cloneWithColumns
(
std
::
move
(
merged_columns
));
return
header
.
cloneWithColumns
(
std
::
move
(
merged_columns
));
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录