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

最新活動更多
-
11月7日立即參評>> 【評選】維科杯·OFweek 2025(第十屆)物聯(lián)網(wǎng)行業(yè)年度評選
-
11月20日立即報名>> 【免費下載】RISC-V芯片發(fā)展現(xiàn)狀與測試挑戰(zhàn)-白皮書
-
即日-11.25立即下載>>> 費斯托白皮書《柔性:汽車生產(chǎn)未來的關(guān)鍵》
-
11月27日立即報名>> 【工程師系列】汽車電子技術(shù)在線大會
-
11月28日立即下載>> 【白皮書】精準(zhǔn)洞察 無線掌控——283FC智能自檢萬用表
-
12月18日立即報名>> 【線下會議】OFweek 2025(第十屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會
推薦專題
- 1 特斯拉工人被故障機(jī)器人打成重傷,索賠3.6億
- 2 AI 時代,阿里云想當(dāng)“安卓” ,那誰是“蘋果”?
- 3 拐點已至!匯川領(lǐng)跑工控、埃斯頓份額第一、新時達(dá)海爾賦能扭虧為盈
- 4 L3自動駕駛延期,逼出車企技術(shù)自我淘汰
- 5 隱退4年后,張一鳴久違現(xiàn)身!互聯(lián)網(wǎng)大佬正集體殺回
- 6 機(jī)器人9月大事件|3家國產(chǎn)機(jī)器人沖刺IPO,行業(yè)交付與融資再創(chuàng)新高!
- 7 谷歌“香蕉”爆火啟示:國產(chǎn)垂類AI的危機(jī)還是轉(zhuǎn)機(jī)?
- 8 7倍機(jī)器人大牛股:高管股東套現(xiàn)VS機(jī)構(gòu)兇猛抱團(tuán),該信誰?
- 9 八部門聯(lián)手放行L3自動駕駛!巨頭開始拼搶萬億市場?
- 10 OpenAI發(fā)布的AI瀏覽器,市場為何反應(yīng)強(qiáng)烈?
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市



分享













