Skip to content
This repository was archived by the owner on May 9, 2024. It is now read-only.

Commit b389f3d

Browse files
committed
[Bench] Reduce input cols number for fetch
To estimate output size of result query to allocate buffer we are running `count*` before some actual queries. This estimation requires only query body argumnets without `select` arguments, so this commit changes input_cols for `count*` query. Resolves: #574 Signed-off-by: Dmitrii Makarenko <[email protected]>
1 parent ae22e1a commit b389f3d

File tree

4 files changed

+64
-11
lines changed

4 files changed

+64
-11
lines changed

omniscidb/QueryEngine/CardinalityEstimator.cpp

+47-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "ErrorHandling.h"
1919
#include "ExpressionRewrite.h"
2020
#include "RelAlgExecutor.h"
21+
#include "Visitors/InputColumnsCollector.h"
2122

2223
size_t RelAlgExecutor::getNDVEstimation(const WorkUnit& work_unit,
2324
const int64_t range,
@@ -101,8 +102,53 @@ RelAlgExecutionUnit create_ndv_execution_unit(const RelAlgExecutionUnit& ra_exe_
101102
RelAlgExecutionUnit create_count_all_execution_unit(
102103
const RelAlgExecutionUnit& ra_exe_unit,
103104
hdk::ir::ExprPtr replacement_target) {
105+
InputColumnsCollector input_columns_collector;
106+
for (const auto& join_condition : ra_exe_unit.join_quals) {
107+
for (const auto& q : join_condition.quals) {
108+
input_columns_collector.visit(q.get());
109+
}
110+
}
111+
112+
for (const auto& q : ra_exe_unit.quals) {
113+
input_columns_collector.visit(q.get());
114+
}
115+
116+
for (const auto& q : ra_exe_unit.simple_quals) {
117+
input_columns_collector.visit(q.get());
118+
}
119+
120+
for (const auto& q : ra_exe_unit.groupby_exprs) {
121+
if (!q)
122+
break;
123+
input_columns_collector.visit(q.get());
124+
}
125+
126+
std::list<std::shared_ptr<const InputColDescriptor>> join_input_col_descs;
127+
auto& input_column_descriptors = input_columns_collector.result();
128+
for (auto& col_var : input_column_descriptors) {
129+
for (auto& icol : ra_exe_unit.input_col_descs) {
130+
if (icol->getColId() == col_var.getColId() &&
131+
icol->getTableId() == col_var.getTableId()) {
132+
join_input_col_descs.emplace_back(icol);
133+
}
134+
}
135+
}
136+
137+
if (join_input_col_descs.empty()) {
138+
join_input_col_descs.insert(join_input_col_descs.end(),
139+
ra_exe_unit.input_col_descs.begin(),
140+
ra_exe_unit.input_col_descs.end());
141+
}
142+
143+
std::stringstream os{};
144+
os << "\n\t[Only Join] Table/Col/Levels: ";
145+
for (const auto& input_col_desc : join_input_col_descs) {
146+
os << "(" << input_col_desc->getTableId() << ", " << input_col_desc->getColId()
147+
<< ", " << input_col_desc->getNestLevel() << ") ";
148+
}
149+
LOG(WARNING) << "Generating count* WU with following Input Columns" << os.str();
104150
return {ra_exe_unit.input_descs,
105-
ra_exe_unit.input_col_descs,
151+
join_input_col_descs,
106152
ra_exe_unit.simple_quals,
107153
ra_exe_unit.quals,
108154
ra_exe_unit.join_quals,

omniscidb/QueryEngine/Descriptors/QueryFragmentDescriptor.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,9 @@ void QueryFragmentDescriptor::buildFragmentPerKernelForTable(
151151
}
152152

153153
ExecutionKernelDescriptor execution_kernel_desc{
154-
device_id, {}, fragment.getNumTuples()};
154+
/*device_id*/ device_id,
155+
/*fragments*/ {},
156+
/*outer_tuple_count*/ fragment.getNumTuples()};
155157
if (table_desc_offset) {
156158
const auto frag_ids =
157159
executor->getTableFragmentIndices(ra_exe_unit,

omniscidb/QueryEngine/JoinFilterPushDown.cpp

+1-9
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "IR/ExprCollector.h"
1919
#include "IR/ExprRewriter.h"
2020
#include "RelAlgExecutor.h"
21+
#include "Visitors/InputColumnsCollector.h"
2122

2223
namespace {
2324

@@ -27,15 +28,6 @@ class BindFilterToOutermostVisitor : public hdk::ir::ExprRewriter {
2728
}
2829
};
2930

30-
class InputColumnsCollector
31-
: public hdk::ir::ExprCollector<std::unordered_set<InputColDescriptor>,
32-
InputColumnsCollector> {
33-
protected:
34-
void visitColumnVar(const hdk::ir::ColumnVar* col_var) override {
35-
result_.insert(InputColDescriptor(col_var->columnInfo(), 0));
36-
}
37-
};
38-
3931
} // namespace
4032

4133
/**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#pragma once
2+
3+
#include <unordered_set>
4+
#include "IR/ExprCollector.h"
5+
6+
class InputColumnsCollector
7+
: public hdk::ir::ExprCollector<std::unordered_set<InputColDescriptor>,
8+
InputColumnsCollector> {
9+
protected:
10+
void visitColumnVar(const hdk::ir::ColumnVar* col_var) override {
11+
result_.insert(InputColDescriptor(col_var->columnInfo(), 0));
12+
}
13+
};

0 commit comments

Comments
 (0)