1. 程式人生 > 其它 >CMU 15445 lab3 QUERY EXECUTION

CMU 15445 lab3 QUERY EXECUTION

總覽

這個lab要實現executors,executor負責query plan(就是operator形成的樹)上的operator並執行它們,對於每個executor,需要實現:

對於這個lab,沒有SQL,執行的查詢計劃都是寫好的運算元樹,並且用的是火山模型,每個運算元的執行器(executor)必須實現Next函式,Next函式的執行粒度是一個tuple,也就是每次執行要麼返回一個tuple,要麼返回一個空指標來表示當前沒有tuple了。那麼每個運算元executor需要實現一個迴圈去呼叫子運算元的Next函式

Task#1 SYSTEM CATALOG

catalog存的資訊是用來顯示一個database有什麼table以及table被存在哪裡,其中還存有了table的index

table怎麼存的?

複習一下資料庫的儲存模型,每個頁存n個tuple,對於一個table,可以根據key,建立B+樹index,去查詢tuple

可以看到在lab中的實現中,leaf node節點的value就是page_id和slot_num,

那麼頁的佈局就是slotted page

catalog

catalog需要實現在資料庫中新增tables通過name或則內部識別符號table_oid_t取tables,主要是實現:

index的新增

Task#2 EXECUTORS

需要實現sequential scans, index scans, inserts, updates, deletes, nested loop joins, nested index joins, limits with offset and aggregations

等運算元的executor,每個executor都有兩個方法——Init用來獲取需要scan的tableNext用來迭代讀取table中的tuple當前運算元的Next方法就是執行迴圈去執行子運算元的Next,
呼叫子運算元是有慣例的順序。這裡的ExecutionEngine採取了工廠模式。
ExecutionEngine中呼叫ExcutionFactory類去將一個AbstractPlanNode轉化為對應的executor,ExecutorContext儲存了一個query的查詢狀態,每次執行一個PlanNode,需要先Init,在execute,

executor的抽象的執行流程

這裡拿seq_scan_executor舉例,

  • 該類繼承於AbstractExecutor
  • AbstractExecutor只有一個成員函式ExecutorContext *exec_ctx_AbstractExecutor還兩個純虛擬函式,Init和Next,這是每個executor都需要實現的
  • ExecutorContext中儲存了一個transaction執行一個query時的context,
  • 一個executor還需要planNode,SeqScanPlanNode繼承於AbstractPlanNodeAbstractPlanNode兩個成員變數分別用於限定輸出的schema與其子planNode
  • SeqScanPlanNode有自己的成員變數,分別用於指定其需要掃描的表與掃描表的tuple需要滿足的謂詞
  • 謂詞是AbstractExpression,決定了返回的結果的schema

修改execution_engine.h中的異常處理?

sequential scan

  • Iterator的每次迭代會獲取一個沒有被刪除的tuple不論是在當前Pgae,還找到新的一個Page的第一個沒被刪除的tuple
  • Next函式如果得到了一個tuple,那麼返回true,否則false
  • 由於根據predicate計算一個tuple是否可行的Evaluate函式返回的是一個Value型別所以需要GetAs把Value轉換為bool型別
  • 建立一個column需要使用AbstractExpression類的子類ColumnValueExpression,ColumnValueExpression的Evaluate方法是主要是tuple->GetValue(schema, col_idx_);,Evaluate的第二個schema引數使用來獲取對應列的型別的而GetValue獲取是分別獲取型別與列中的真實資料
    對於varchar型別的資料,由於不定長,所以在tuple的對應column中記錄的是一個四位元組的地址,而對於inline的資料(inline應該就是指不是varchar的資料),就放在tuple的對應位置可以猜測儲存的varchar資料的頭4個位元組是varcahr資料的大小

問題

  • 這個三個引數是幹嘛用的?key_schema用來表示key的列的樣子?
  • 一個表可以有很多個index
  • 一個Table就有一個TableHeap,用來儲存Table的頁且採取doubly-linked list的儲存頁的方式
  • 這裡返回的是一個Iterator它過載了->
  • 建立索引的時候需要把一個表中的所有的tuple的對於index放到索引資料解構中
  • 一個TablePage刪除tuple的時候,不會真的刪除,用來實現MVCC嗎?