CMU 15445 lab3 QUERY EXECUTION
阿新 • • 發佈:2022-03-26
總覽
這個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
呼叫子運算元是有慣例的順序。這裡的
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
繼承於AbstractPlanNode
,AbstractPlanNode
兩個成員變數分別用於限定輸出的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嗎?