對於next函數每次調用時,返回一個元組或空標記(若是沒有更多元組python
對於上面這個圖的理解就是獲取全部的r.id
而後構建hash表sql
而後在right的關係中獲取出全部知足要求的S.ID
數據庫
這裏的evalPred(t)
就等價於 S.value > 100
express
幾乎全部的DBMS都是用上面的方法。可是容許咱們流水線化的實現函數
不過一些操做必須是順序化的如Joins、Order By優化
一次處理全部輸入,而後一次得到它的全部輸出。lua
能夠發現這種實現沒有了next函數(能夠把next理解成一種迭代器)3d
而是在一個list
中放了全部知足要求的輸入。而後最後也是得到全部輸出code
對於OLTP(主要是對數據的增刪改)工做負載更好,由於一次訪問少許元組。→下降執行/協調開銷。→更少的函數調用。blog
Not good for OLAP(主要是對於大型數據的分析) queries with large intermediate results.
和上面模型的區別是這種模型用batch
代替了所有
這種方法適合OLAP
由於它大大減小了每一個運算符的執行次數
DBMS能夠訪問存儲於table中的數據的最簡單方法莫過於順序掃描法
for page in table.pages: for t in page.tuples: if (check(t)): // DO something
很顯然這種方法很差。下面來看一些對於這個方法的簡單優化
1. Zone MAPS
先維護一些關於這個page 的信息
對於這個page那們咱們若是要執行
SELECT * FROM TABLE WHERE val > 500
咱們就不用訪問這個page
了由於咱們經過Zone Map
知道了這個page
裏最大的val爲400.
2. LATE MATERIALIZATION
DBMS能夠延遲拼接元組。到最上層的操做再進行元祖拼接
對於上面,這個操做而言咱們進行一些分析
3. HEAP CLUSTERING
就是前面說過的聚簇索引。
這個比較簡單對於每個索引根據條件獲取一個集合。而後把集合結合起來最後根據另外一個查詢條件得到結果
2. INDEX SCAN PAGE SORTING
檢索元組在非聚簇索引中是十分低效的
DBMS能夠根據page id對於元組進行排序。這樣就能夠把咱們隨機訪問變成順序訪問
當執行語句發生的時候。咱們會有一個Execution Context
的東西來保存咱們的上下文
上下文中包含
當前元組 執行的參數 Table的Scheme