本節介紹PolarDB PostgreSQL版(兼容Oracle)的查詢機制。
SELECT
使用SELECT查詢數據時,需要從磁盤中讀取一個數據塊到內存中,然后通過內存中數據塊獲取返回結果。
INSERT
當您使用INSERT插入一條數據時,具體過程如下:
- 從數據文件中讀取一個數據塊到內存中,并將這行數據寫入這個數據塊,系統生成一條INSERT的WAL日志。
- 當執行COMMIT命令后,系統會產生一條COMMIT的WAL日志。
- INSERT WAL日志和COMMIT WAL日志產生后會被立即寫入磁盤,CLOG緩存記錄這個事務提交成功的信息。
- 數據塊中的數據通過bgwriter寫入到數據文件中,同時更新CLOG文件。
UPDATE
上圖中,txid表示事務號,t_xmin表示插入的事務號,t_xmax表示刪除事務號,t_cid表示事務內命令的序號,t_tcid表示數據塊內的偏移量,data表示實際數據存儲的值。
- 事務101
左側SQL表示在tbl表中插入一行值為0的數據,右側表示實際的數據塊存儲內容。事務號為101;由于沒有刪除事務,所以刪除事務號為0;事務內命令的序號為0;偏移量為(0,1)表示數據塊的第一個偏移位置。
- 事務102事務102更新了tbl表,設置ID等于1,然后繼續更新設置ID等于2并提交。
- 從右側上半張圖可以看出,刪除事務號從0變成了102,表示這行數據被102事務刪除了;偏移量變成了(0,2),表示指向了0號數據塊的第二個偏移位置;從第二個偏移位置可以看到事務號為102,表示事務102插入了這行數據,數據存儲值為1。
- 從右側下半張圖可以看出,事務號依舊是102,偏移量指向了(0,3),表示存儲實際的數據為2;事務內命令的序號為1表示事務內的第二條命令進行了更新,與第二個UPDATE對應。
- 事務103
從左側SQL語句表示執行了刪除tbl表的動作,刪除事務號更新為103。