From 61d66b4ef9f097bd7ce763211faacae721a4d18b Mon Sep 17 00:00:00 2001 From: YangCaiyin Date: Mon, 8 Apr 2024 23:39:38 +0800 Subject: [PATCH] feat: support prediction push-down in scan and record time cost --- .../query_engine/optimizer/optimizer.h | 6 +++++- .../operator/index_scan_physical_operator.h | 8 ++++++- .../query_engine/structor/tuple/row_tuple.h | 3 +-- .../query_engine/optimizer/optimzer.cpp | 9 ++++++-- .../query_engine/optimizer/rewriter.cpp | 2 -- .../operator/index_scan_physical_operator.cpp | 21 +++++++++++++++++++ src/server/query_engine/query_engine.cpp | 13 ++++++++++-- .../storage_engine/index/bplus_tree.cpp | 8 +++---- test/unittest/CMakeLists.txt | 1 - 9 files changed, 56 insertions(+), 15 deletions(-) diff --git a/src/server/include/query_engine/optimizer/optimizer.h b/src/server/include/query_engine/optimizer/optimizer.h index 6667d3f..de29ed1 100644 --- a/src/server/include/query_engine/optimizer/optimizer.h +++ b/src/server/include/query_engine/optimizer/optimizer.h @@ -1,9 +1,13 @@ #pragma once -#include "include/query_engine/planner/node/logical_node.h" #include +#include "include/query_engine/planner/node/logical_node.h" +#include "rewriter.h" + class Optimizer{ public: RC rewrite(std::unique_ptr &logical_operator); +private: + Rewriter rewriter_; }; \ No newline at end of file diff --git a/src/server/include/query_engine/planner/operator/index_scan_physical_operator.h b/src/server/include/query_engine/planner/operator/index_scan_physical_operator.h index 2f90631..14520da 100644 --- a/src/server/include/query_engine/planner/operator/index_scan_physical_operator.h +++ b/src/server/include/query_engine/planner/operator/index_scan_physical_operator.h @@ -45,14 +45,19 @@ class IndexScanPhysicalOperator : public PhysicalOperator std::string param() const override; + void set_predicates(std::vector> &predicates) { + predicates_ = std::move(predicates); + } + private: + RC filter(RowTuple &tuple, bool &result); Table *table_ = nullptr; Index *index_ = nullptr; IndexScanner *index_scanner_ = nullptr; RecordFileHandler *record_handler_ = nullptr; bool readonly_ = false; - RecordPageHandler record_page_handler_ =; + RecordPageHandler record_page_handler_; Record current_record_; RowTuple tuple_; @@ -60,4 +65,5 @@ class IndexScanPhysicalOperator : public PhysicalOperator Value right_value_; bool left_inclusive_ = false; bool right_inclusive_ = false; + std::vector> predicates_; }; diff --git a/src/server/include/query_engine/structor/tuple/row_tuple.h b/src/server/include/query_engine/structor/tuple/row_tuple.h index 1a4c93e..36fcc14 100644 --- a/src/server/include/query_engine/structor/tuple/row_tuple.h +++ b/src/server/include/query_engine/structor/tuple/row_tuple.h @@ -89,8 +89,7 @@ class RowTuple : public Tuple const FieldExpr *field_expr = species_[i]; const Field &field = field_expr->field(); if (0 == strcmp(table_name, field.table_name()) && - 0 == strcmp(field_name, field.field_name()) && - 0 == strcmp(spec.alias(), field.table_alias())) { + 0 == strcmp(field_name, field.field_name())) { return cell_at(i, cell); } } diff --git a/src/server/query_engine/optimizer/optimzer.cpp b/src/server/query_engine/optimizer/optimzer.cpp index 4f7c2e7..b0311e6 100644 --- a/src/server/query_engine/optimizer/optimzer.cpp +++ b/src/server/query_engine/optimizer/optimzer.cpp @@ -2,6 +2,11 @@ RC Optimizer::rewrite(std::unique_ptr &logical_operator) { - //Currently we don't support optimization. - return RC::SUCCESS; + RC rc; + bool change = false; + rc = rewriter_.rewrite(logical_operator, change); + if(rc != RC::SUCCESS){ + return rc; + } + return rc; } \ No newline at end of file diff --git a/src/server/query_engine/optimizer/rewriter.cpp b/src/server/query_engine/optimizer/rewriter.cpp index 82e23e7..5e8da1d 100644 --- a/src/server/query_engine/optimizer/rewriter.cpp +++ b/src/server/query_engine/optimizer/rewriter.cpp @@ -6,8 +6,6 @@ Rewriter::Rewriter() { - rewrite_rules_.emplace_back(new ExpressionRewriter); - rewrite_rules_.emplace_back(new PredicateRewriteRule); rewrite_rules_.emplace_back(new PredicatePushdownRewriter); } diff --git a/src/server/query_engine/planner/operator/index_scan_physical_operator.cpp b/src/server/query_engine/planner/operator/index_scan_physical_operator.cpp index ea0f864..49a7f2d 100644 --- a/src/server/query_engine/planner/operator/index_scan_physical_operator.cpp +++ b/src/server/query_engine/planner/operator/index_scan_physical_operator.cpp @@ -66,3 +66,24 @@ std::string IndexScanPhysicalOperator::param() const { return std::string(index_->index_meta().name()) + " ON " + table_->name(); } + +RC IndexScanPhysicalOperator::filter(RowTuple &tuple, bool &result) +{ + RC rc = RC::SUCCESS; + Value value; + for (std::unique_ptr &expr : predicates_) { + rc = expr->get_value(tuple, value); + if (rc != RC::SUCCESS) { + return rc; + } + + bool tmp_result = value.get_boolean(); + if (!tmp_result) { + result = false; + return rc; + } + } + + result = true; + return rc; +} \ No newline at end of file diff --git a/src/server/query_engine/query_engine.cpp b/src/server/query_engine/query_engine.cpp index ccc037e..8c4684e 100644 --- a/src/server/query_engine/query_engine.cpp +++ b/src/server/query_engine/query_engine.cpp @@ -6,11 +6,13 @@ #include "include/query_engine/analyzer/analyzer.h" #include "include/session/communicator.h" +#include #include // 处理从session传来的请求, 包含sql执行与结果写回 bool QueryEngine::process_session_request(SessionRequest *request) { RC rc; + char *time_str = new char[64]; bool need_disconnect = true; std::string sql = request->query(); @@ -22,6 +24,8 @@ bool QueryEngine::process_session_request(SessionRequest *request) { request->session()->set_current_request(request); QueryInfo query_info(request, sql); + + auto start_time = std::chrono::high_resolution_clock::now(); rc = executeQuery(&query_info); if(RC_FAIL(rc) && rc != RC::UNIMPLENMENT){ request->get_communicator()->write_state(request->sql_result(), need_disconnect); @@ -30,10 +34,15 @@ bool QueryEngine::process_session_request(SessionRequest *request) { }else{ executor_.execute(request, &query_info, need_disconnect); } - + auto end_time = std::chrono::high_resolution_clock::now(); + auto duration = std::chrono::duration_cast(end_time - start_time); + snprintf(time_str, 64, "Cost time: %ld ns\n", duration.count()); + + request->get_communicator()->write_result(time_str, strlen(time_str)); + request->get_communicator()->flush(); request->session()->set_current_request(nullptr); Session::set_current_session(nullptr); - + delete[] time_str; return need_disconnect; } diff --git a/src/server/storage_engine/index/bplus_tree.cpp b/src/server/storage_engine/index/bplus_tree.cpp index 9478404..89a8f64 100644 --- a/src/server/storage_engine/index/bplus_tree.cpp +++ b/src/server/storage_engine/index/bplus_tree.cpp @@ -1835,13 +1835,13 @@ RC BplusTreeScanner::next_entry(RID &rid, bool isdelete) if (!first_emitted_) { fetch_item(rid); first_emitted_ = true; + + if (!isdelete) { + iter_index_++; + } return RC::SUCCESS; } - // if (!isdelete) { - // iter_index_++; - // } - LeafIndexNodeHandler node(tree_handler_.file_header_, current_frame_); if (iter_index_ < node.size()) { if (touch_end()) { diff --git a/test/unittest/CMakeLists.txt b/test/unittest/CMakeLists.txt index b60a89c..48871c8 100644 --- a/test/unittest/CMakeLists.txt +++ b/test/unittest/CMakeLists.txt @@ -15,7 +15,6 @@ FOREACH (F ${ALL_SRC}) get_filename_component(prjName ${F} NAME_WE) MESSAGE("Build ${prjName} according to ${F}") ADD_EXECUTABLE(${prjName} ${F}) - # 不是所有的单测都需要链接server_static TARGET_LINK_LIBRARIES(${prjName} common pthread dl gtest gtest_main server_static) gtest_discover_tests(${prjName}) ENDFOREACH (F)