PG:表訪問方法API如何進行順序掃描?
引言
PG中有很多方法檢索數據并返回給用戶。依賴于用戶的SQL語句,查詢計劃模塊生成最有方法以檢索請求的數據。順序掃描是用戶請求大量數據時或者當表沒有索引時使用的一種檢索方法(例如select * from tablename;);順序掃描方法由表的表訪問方法APIchuli,heap表訪問方法時當前版本中默認的方法。本文中,將會介紹表訪問方法API如何進行順序掃描。
PG中表訪問方法APIs
PG12中引入了可拔插表訪問方法,允許開發者重定義存儲/檢索表數據的方法。這個API包含42個函數。定義在tableam.h中,這些接口函數在typedef struct TableAmRoutine中。下面介紹關于順序掃描的routine,幫助開發這了解如何創建自己的表訪問方法。
順序掃描的調用棧
42個routines中很少由一個會被執行器調用來完成順序掃描的請求。本節按調用順序描述這些接口。
relation_size
函數聲明:uint64 (*relation_size) (Relation rel, ForkNumberforkNumber);
Relation_size函數是第一個被調用的函數,相對簡單。通過rel和forkNumber,返回對于文件的大學。默認heap表訪問方法會調用存儲管理器smgr,計算出對于表文件的頁數,然后成語每個頁大小BLCKSZ默認8KB。如果不確定表和forknumber之間的關系,可以查詢網址https://www.highgo.ca/2020/10/23/free-space-mapping-file-in-details/了解更多信息。
返回的大小設置順序掃描的邊界。
slot_callbacks
函數聲明:const TupleTableSlotOps*(*slot_callbacks) (Relation rel);
下一步,執行器需要找出此表訪問方法與哪一個tuple table slot(TTS)回調操作的集合兼容。TTS是routines集合,確保tuple存儲在執行器和訪問方法之間兼容。執行器執行TTS回調以TupleTableSlot結構傳輸tuple,該結構執行器可以認識。默認的heap訪問方法使用execTuples.c中定義的TTSOpsBufferHeapTuple來處理這個操作。
scan_begin
函數聲明:TableScanDesc (*scan_begin) (Relationrel,
Snapshotsnapshot,
int nkeys,struct ScanKeyData *key,
ParallelTableScanDesc pscan,
uint32flags);
現在可以開始掃描。這個函數是順序掃描的初始化函數,將使用執行器傳輸的參數分配一個新的scan描述符。Scan描述符結構的目的在于執行順序掃描時進行跟蹤。例如,要跟蹤從哪里開始掃描,上次掃描塊號是什么時候,應該回復掃描哪個塊,以及掃描了多少塊等等。一旦順序掃描完成,scan描述符會被銷毀。
執行器希望接口返回指向TableScanDesc結構的指針。
scan_getnextslot
函數聲明:bool (*scan_getnextslot) (TableScanDescscan,
ScanDirection direction,
TupleTableSlot *slot);
這個函數是順序掃描的主要函數,從buffer管理器中獲取一個tuple,轉換成TTS格式并將它存儲到slot指針中。每次調用返回一個tuple。如果表由1000個tuple,這個函數會調用1000次。返回true表示需要再次調用獲取下一個tuple,返回false表示獲取了所有元組,不用再調用這個函數了。
通常情況下順序掃描以per-page模式進行工作。也就是說從buffer管理器中加載并讀入一個block到內存,然后從這個頁中一個元組一個元組地進行返回,獲取完一頁,再加載另一頁進行掃描。
Scan描述符起著重要作用,因為這個結構體中存有大量控制信息,調用scan_getnextslot會更新。
scan_end
函數聲明:void (*scan_end) (TableScanDesc scan);
順序掃描調用的最后一個函數,用于清理scan描述符。此時執行器已經通過順序掃描方法獲取了所有元組信息。
準備返回的數據
現在執行器通過表訪問方法掃描了所有元組,需要進入過濾流程決定哪些元組符合返回的條件(例如使用WHERE限制掃描結果)。由execScan.c中的for循環在每個TTS上執行ExecQual,最終結果發送給用戶。
總結
流程圖如下:

請輸入評論內容...
請輸入評論/評論長度6~500個字
最新活動更多
- 1 特斯拉Optimus Gen3量產在即,哪些環節最具確定性?
- 2 OpenAI深夜王炸!ChatGPT Images 2.0實測:中文穩、細節炸,設計師慌了
- 3 AI狂歡遇上油價破百,全球股市還能漲多久? | 產聯看全球
- 4 6000億美元估值錨定:字節跳動的“去單一化”突圍與估值重構
- 5 Tesla AI5芯片最新進展總結
- 6 連夜測了一波DeepSeek-V4,我發現它可能只剩“審美”這個短板了
- 7 熱點丨AI“瑜亮之爭”:既生OpenClaw,何生Hermes?
- 8 2026,人形機器人只贏了面子
- 9 AI界的殺豬盤:9秒刪庫跑路,全員被封號,還繼續扣錢!
- 10 AI Infra產業鏈卡在哪里了?


分享













