PG:表訪問(wèn)方法API如何進(jìn)行順序掃描?
引言
PG中有很多方法檢索數(shù)據(jù)并返回給用戶。依賴(lài)于用戶的SQL語(yǔ)句,查詢計(jì)劃模塊生成最有方法以檢索請(qǐng)求的數(shù)據(jù)。順序掃描是用戶請(qǐng)求大量數(shù)據(jù)時(shí)或者當(dāng)表沒(méi)有索引時(shí)使用的一種檢索方法(例如select * from tablename;);順序掃描方法由表的表訪問(wèn)方法APIchuli,heap表訪問(wèn)方法時(shí)當(dāng)前版本中默認(rèn)的方法。本文中,將會(huì)介紹表訪問(wèn)方法API如何進(jìn)行順序掃描。
PG中表訪問(wèn)方法APIs
PG12中引入了可拔插表訪問(wèn)方法,允許開(kāi)發(fā)者重定義存儲(chǔ)/檢索表數(shù)據(jù)的方法。這個(gè)API包含42個(gè)函數(shù)。定義在tableam.h中,這些接口函數(shù)在typedef struct TableAmRoutine中。下面介紹關(guān)于順序掃描的routine,幫助開(kāi)發(fā)這了解如何創(chuàng)建自己的表訪問(wèn)方法。
順序掃描的調(diào)用棧
42個(gè)routines中很少由一個(gè)會(huì)被執(zhí)行器調(diào)用來(lái)完成順序掃描的請(qǐng)求。本節(jié)按調(diào)用順序描述這些接口。
relation_size
函數(shù)聲明:uint64 (*relation_size) (Relation rel, ForkNumberforkNumber);
Relation_size函數(shù)是第一個(gè)被調(diào)用的函數(shù),相對(duì)簡(jiǎn)單。通過(guò)rel和forkNumber,返回對(duì)于文件的大學(xué)。默認(rèn)heap表訪問(wèn)方法會(huì)調(diào)用存儲(chǔ)管理器smgr,計(jì)算出對(duì)于表文件的頁(yè)數(shù),然后成語(yǔ)每個(gè)頁(yè)大小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í)行器需要找出此表訪問(wèn)方法與哪一個(gè)tuple table slot(TTS)回調(diào)操作的集合兼容。TTS是routines集合,確保tuple存儲(chǔ)在執(zhí)行器和訪問(wèn)方法之間兼容。執(zhí)行器執(zhí)行TTS回調(diào)以TupleTableSlot結(jié)構(gòu)傳輸tuple,該結(jié)構(gòu)執(zhí)行器可以認(rèn)識(shí)。默認(rèn)的heap訪問(wèn)方法使用execTuples.c中定義的TTSOpsBufferHeapTuple來(lái)處理這個(gè)操作。
scan_begin
函數(shù)聲明:TableScanDesc (*scan_begin) (Relationrel,
Snapshotsnapshot,
int nkeys,struct ScanKeyData *key,
ParallelTableScanDesc pscan,
uint32flags);
現(xiàn)在可以開(kāi)始掃描。這個(gè)函數(shù)是順序掃描的初始化函數(shù),將使用執(zhí)行器傳輸?shù)膮?shù)分配一個(gè)新的scan描述符。Scan描述符結(jié)構(gòu)的目的在于執(zhí)行順序掃描時(shí)進(jìn)行跟蹤。例如,要跟蹤從哪里開(kāi)始掃描,上次掃描塊號(hào)是什么時(shí)候,應(yīng)該回復(fù)掃描哪個(gè)塊,以及掃描了多少塊等等。一旦順序掃描完成,scan描述符會(huì)被銷(xiāo)毀。
執(zhí)行器希望接口返回指向TableScanDesc結(jié)構(gòu)的指針。
scan_getnextslot
函數(shù)聲明:bool (*scan_getnextslot) (TableScanDescscan,
ScanDirection direction,
TupleTableSlot *slot);
這個(gè)函數(shù)是順序掃描的主要函數(shù),從buffer管理器中獲取一個(gè)tuple,轉(zhuǎn)換成TTS格式并將它存儲(chǔ)到slot指針中。每次調(diào)用返回一個(gè)tuple。如果表由1000個(gè)tuple,這個(gè)函數(shù)會(huì)調(diào)用1000次。返回true表示需要再次調(diào)用獲取下一個(gè)tuple,返回false表示獲取了所有元組,不用再調(diào)用這個(gè)函數(shù)了。
通常情況下順序掃描以per-page模式進(jìn)行工作。也就是說(shuō)從buffer管理器中加載并讀入一個(gè)block到內(nèi)存,然后從這個(gè)頁(yè)中一個(gè)元組一個(gè)元組地進(jìn)行返回,獲取完一頁(yè),再加載另一頁(yè)進(jìn)行掃描。
Scan描述符起著重要作用,因?yàn)檫@個(gè)結(jié)構(gòu)體中存有大量控制信息,調(diào)用scan_getnextslot會(huì)更新。
scan_end
函數(shù)聲明:void (*scan_end) (TableScanDesc scan);
順序掃描調(diào)用的最后一個(gè)函數(shù),用于清理scan描述符。此時(shí)執(zhí)行器已經(jīng)通過(guò)順序掃描方法獲取了所有元組信息。
準(zhǔn)備返回的數(shù)據(jù)
現(xiàn)在執(zhí)行器通過(guò)表訪問(wèn)方法掃描了所有元組,需要進(jìn)入過(guò)濾流程決定哪些元組符合返回的條件(例如使用WHERE限制掃描結(jié)果)。由execScan.c中的for循環(huán)在每個(gè)TTS上執(zhí)行ExecQual,最終結(jié)果發(fā)送給用戶。
總結(jié)
流程圖如下:
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
即日-12.26立即報(bào)名>>> 【在線會(huì)議】村田用于AR/VR設(shè)計(jì)開(kāi)發(fā)解決方案
-
1月8日火熱報(bào)名中>> Allegro助力汽車(chē)電氣化和底盤(pán)解決方案優(yōu)化在線研討會(huì)
-
即日-1.14火熱報(bào)名中>> OFweek2025中國(guó)智造CIO在線峰會(huì)
-
即日-1.16立即報(bào)名>>> 【在線會(huì)議】ImSym 開(kāi)啟全流程成像仿真時(shí)代
-
即日-1.24立即參與>>> 【限時(shí)免費(fèi)】安森美:Treo 平臺(tái)帶來(lái)出色的精密模擬
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書(shū)》
推薦專(zhuān)題
- 1 人形機(jī)器人核心零部件,誰(shuí)是盈利最強(qiáng)企業(yè)?
- 2 AI Agent現(xiàn)狀如何?聊聊近期國(guó)內(nèi)的智能體市場(chǎng)動(dòng)向
- 3 5nm重大突破,研祥智能助力半導(dǎo)體企業(yè)高效發(fā)展!
- 4 人形機(jī)器人引爆“PEEK材料”!概念股梳理(名單)
- 5 馬云沒(méi)回牌桌,但重注全壓在了
- 6 蘋(píng)果或?qū)渴肿止?jié)騰訊大模型,我國(guó)大模型產(chǎn)業(yè)發(fā)展駛?cè)肟燔?chē)道
- 7 豆包AI登頂國(guó)內(nèi)第一!概念股梳理(名單)
- 8 押注AI王者歸來(lái),歌爾股份“智能體”在下一盤(pán)“大棋”
- 9 AI超級(jí)應(yīng)用什么時(shí)候才能出現(xiàn)?
- 10 英偉達(dá)迎來(lái)當(dāng)頭一棒
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷(xiāo)售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷(xiāo)售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專(zhuān)家 廣東省/江門(mén)市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市