1、Oracle兼兼容容性性和和全全局局臨臨時時表表的的實實現現阿里云只能事業群-曾文旌大綱 兼容性的特點 全局臨時表特性概述 全局臨時表的實現 和 PostgreSQL 社區的交流 總結目標 更短的遷移時間 快速評估 相關設施工具化服務化 更小的遷移風險 復雜 SQL 不調整邏輯 更好的性能 SQL執行效率高相關兼容點 臨時表 分區表 復雜 SQL connect by SQL 性能優化 執行器優化器 存儲過程內置包兼容性的特點 SQL 層特性 影響用戶體驗 改造難度 SQL 標準 結合在PostgreSQL中的實現綜合考慮全局臨時表特點 大量用戶反饋 80%的 oracle 改造評估報告中 改
2、造難度 業務需要每個會話不斷創建的臨時表。SQL 標準 有對全局臨時表清晰的定義 各數據庫產品沒有廣泛遵守臨時表特點 PostgreSQL 支持本地臨時表 local temporary table 僅支持全局臨時表語法,不支持全局臨時表特性 會話退出后臨時表定義和數據被刪除MySQL 僅支持 CREATETEMPORARYTABLE 定義和數據會話間不共享全局臨時表的特點CREATE GLOBAL TEMPORARY|TEMP TABLE table-namecolumn-definition,column-definition*ON COMMIT DELETE|PRESERVEROWS G
3、lobalThemetadataispersistentThemetadataisvisibletoallsessions ONCOMMITWhenONCOMMITDELETEROWSisspecifiedorisdefault,thenthedatadisappearswhenCOMMIThappens.全局臨時表優勢 表定義持久化且會話間共享 每個會話不需要單獨進行臨時表和相關索引的創建 不會由于頻繁 DDL 造成系統表膨脹 不會頻繁創建和刪除底層文件Global temp table vs local temp tableglobaltemptablelocaltemptablenoda
4、tashareacrosssessionyesyesSupportOnCOMMIT(DELETEROWS/PRESERVEROWS)withsamebehavioryesyesuselocalbufferyesyessharetableschemaacrosssessionsyesnodefinitiondeletedafterasessioncompletesnoyesONCOMMITDROPnoyesLocal temp table 的實現每個會話使用自己的 my_temp_namespace,同名不同oidTemp table 強制歸屬到 my_temp_namespace不同會話的my
5、_temp_namespace 不可以相互訪問會話退出時,刪除整個 my_temp_namespace使用 local buffer全局臨時表的實現 實現上的考慮 持久化的表定義 一份定義多份數據 多份數據多份統計信息 數據可見性 mvcc 異常清理 DDL全局臨時表的實現catalogRELPERSISTENCEONCOMMITClauserelpages,reltuples,relfrozenxidpg_statisticstoraget$(backendid)_$(relfilenode)全局臨時表的實現DDLDroptable如何刪除多個會話中的localbuffer 和storage
6、fileCreateindex其他會話中已經有數據怎么辦Altertable需要重寫所有會話中的數據文件么Truncatetable如何做到可回滾Cluster/vacuumfull改變 relfilenode全局臨時表的實現統計信息和 dmlrelpages,reltuplespg_statisticNoautovacuumVacuum/analyzePlanner每個會話中的數據有一份獨立的統計信息全局臨時表的實現數據可見性 mvccrelfrozenxid同一張表,不同會話有不同的 relfrozenxidrelfrozenxid 的推進Vacuum會話級 Proc-relfrozenx
7、id需要保留 gtt 所需的 clog不能由于保留了“tooold”的數據導致資源無法回收全局臨時表的實現和社區的互動全局臨時表的實現社區的分歧Local buffer VS shared buffer統計信息的必要性Temp table on standbySession table VS global temp table全局臨時表的實現社區的反饋global temp table 沿用local temp table 沿用 local buffer 的設計第一個版本包括核心特性不包括 temp table on standbyProposalGlobaltemporarytableshttps:/www.postgresql-archive.org/Proposal-Global-temporary-tables-td6107254.html全局臨時表的實現todo list可變 relfilenodegtt 上更索引的使用體驗優化自增列gtt on standby/ro總結很多兼容性問題實質是商業產品產品化程度更高SQL 標準細節很多,數據庫產品選擇性的遵守PG社區相對謹慎,完成一個特性往往不設完成時間點,需要充分討論細節,這是完成高質量特性的一種方法。沒有完美的方案,總是需要做取舍。