〈Software Engineering Daily〉-EP-Scaling Time-Series Workloads on Postgres

https://softwareengineeringdaily.com/podcasts/scaling-time-series-workloads-on-postgres/

感測器讀數、金融行情、應用程式遙測,都是一路往下寫、很少回頭改,查的時候又幾乎總是一段時間。TimescaleDB 是 Tiger Data 的開源資料庫,以 PostgreSQL extension 把時序能力加進 Postgres。它是 extension,不是 fork。SQL 還是同一套,交易跟分析可以留在同一個系統,不必把資料拆到兩套工具。

這一集是 Tiger Data 產品管理總監 Brandon Purcell,跟 Kevin Ball 談這件事。Kevin Ball,節目裡也叫 KBall,是 Mento 的工程副總,也單獨帶工程師跟工程主管。他共同創辦過兩家公司、當過 CTO,辦過 San Diego JavaScript Meetup,也在 Latent Space 底下組 AI in Action。Brandon 的 Postgres 資歷快二十年。早年在軍中就寫過程式,接著進 Adobe 做過好幾個角色,後來跟幾個人做出 Spatial Key,一家蓋在 Postgres 上的地理空間分析平台。一開始橫向做很多產業,後來轉進保險,從核保、事件應變到投資組合管理。大約十三年後公司賣掉。他當時是 CTO,休息一段之後想回到技術跟產品。他說自己喜歡 Postgres,也覺得 Tiger Data 把 Postgres 往上推了一階。

寫得多、改得少,一張表會胖到查不動

做網站的人多半從關聯式物件開始,一筆一筆的紀錄。時序是另一種形狀。一台裝置、或一整群裝置,週期性吐讀數。製造、機器人、醫療器材、金融跟加密貨幣交易、智慧建築、工業系統,都有這種流。Brandon 隨口估,大概六成的情況是從關聯式資料庫起手,開發者裡 Postgres 又用得最多。資料一累積,vanilla Postgres 開始卡住:寫入變瓶頸,表一腫讀就變慢,單一表上的索引跟著長大,時間範圍的查詢也吃力。

他講的實體世界還在變多。太陽能這類設備週期性吐讀數,裝置可以到幾十萬、甚至幾百萬台。他們有一個客戶,兩千兩百萬台裝置,每隔幾秒、每一秒、有的甚至不到一秒就吐一筆。寫進來的量,以及隨時間堆高的量,會用關聯式資料庫本來不太碰到的方式去壓系統。

同一套系統卻還是要交易、要關聯。人通常從 Postgres 開始,長到查詢變慢、寫入變慢,面前兩條路。一條把分析拆出去,另外養一套分析庫,交易庫留下。另一條用 TimescaleDB,把兩邊放在同一個系統。拆出去就要管多條資料管線,那些系統的 SQL 多半又跟 Postgres 有一點不一樣,應用程式得改寫一段。留在 extension 裡,他說應用程式可以完全不用改。

Brandon 自己做過很多網站。網站多半是 CRUD,讀寫交錯。有東西持續吐時序,問題就不一樣。人碰到寫入爆、讀變慢,常常拿問題去問 LLM,或自己搜,然後撞上 TimescaleDB。他說進公司之前,根本不知道有這個產品。KBall 則是從做網站的人看過去:實體世界那種測試基礎設施,資料量很不真實。

表的長相不變,底下按時間切塊

開發者看到的模型沒有變。一筆讀數、一個 timestamp、再加上這台裝置帶的屬性,搬進 Timescale 之後欄位還是那些。底下多出來的是 hypertable。大家懂的還是 table。hypertable 做自動分區,依時間把資料切成一塊一塊 chunk,查的時候不必一次把全部讀進來。

從上面看,它仍是一張表。Brandon 說價值常常出現在這種規模:幾十億列再往上堆,時間拉過十年。你若只查比較近的資料,query planner 只會碰到該碰到的 chunk。

chunk 其實就是表,上面再疊一層 Timescale 用來組織它們的 metadata。列存那側的索引也拆到每個 chunk。一張巨大的表最痛的地方之一,是索引肥到每次插入都要更新它。切塊之後,這個成本關在當下那一塊。

預設 chunk 是七天。量很大可以收到一小時。他說從開發者的角度看,出廠設定多半就能開始。分區也不只時間,還有數值分區,以及帶時間成分的 UUID v7。

KBall 十年前碰過這個痛。當時是幾億列,就得規劃分割表,而且分割做在應用層。他以為這套大概就是依日、月、年切時間桶。Brandon 說,Postgres 自帶的其他分區方案可以用,在這個問題域裡他覺得多半不必。人查資料,時間幾乎總是其中一個條件;裝置世界再加裝置或其他欄位。他們內部有個叫 segment by 的做法,決定資料怎麼切進 batch,通常是 device ID、某種 tenant ID 或 user ID。引擎把相近的資料擺在一起,壓縮更緊,查也更快。這就是列存跟欄存混用時,重新分組、做出邏輯 batch 的那一步。

Join 還在資料庫裡。裝置或使用者的 metadata 常常放在沒有按時間切的普通表,可以直接 join。拆成兩套系統,這件事得拉回應用層:各自查完,再在程式裡拼。留在 Postgres,就是寫一條查詢、join、聚合、丟回給使用者。KBall 記得,分割一旦做到應用層,以前在 SQL 裡能做的事突然得搬進程式。

extension 的做法是攔查詢,讓 query planner 去跑,把請求送到對的 chunk。Brandon 用過很多年 PostGIS,對 Postgres 能擴充到什麼程度一直很驚訝。TimescaleDB 走同一條:靠可擴充性去碰 query planner,並且把「少碰 chunk」這條路磨很久。歷史可以很長,查詢只摸需要的那幾塊。

寫入的衰退關在正在寫的那一塊

很多人是寫入先爆,後面談效能卻常在講讀。chunk 改了有沒有用,索引要不要動,vanilla Postgres 裡本來就有寫入重的索引取捨。

Brandon 說那些原則還在,差別主要在 chunk。追加寫入時,要想的是這一塊在轉成欄存、壓下去之前,當列存會有多大。chunk 很多,索引主要只擔心正在寫的那一塊。

一般 Postgres 表寫久了,每秒能吞的列數會線性往下掉。TimescaleDB 若 chunk 切得對,他說這條線不會往下掉。路由也允許把舊的歷史資料回補進舊 chunk。預設先進列存,再依政策轉成欄存。直接寫進欄存也做得到,這塊還在演進。他說在普通硬體上,寫入可以到每秒一百萬列以上。vanilla Postgres 很難做到,資料一大就掉很快。

KBall 追問:vanilla Postgres 的衰退跟著整張表走,TimescaleDB 是不是就跟著 chunk 走?Brandon 說他看到的線差不多是平的。他記得有一份獨立測試,不確定是不是微軟做的。chunk 大小對查詢的影響,大概大於對寫入的影響。除非一塊設成三十天或兩個月、而且資料非常多,單一 chunk 不至於長到幾千萬、幾億列,資料會散開。

hypercore 把舊資料壓進欄存

chunk 裡面還有 hypercore,列存跟欄存混在一起。Postgres 典型是列存,一列一列排。透過政策可以自動搬,開發者也能自己控,資料會再進欄存。搬過去是為了壓縮。

欄存以前很不能改。他們改過之後,裡面的資料現在可以動。空間上,他說使用者那邊常見省下九成,最高看過百分之九十八,常常是因為讀數高度重複。

另一頭是向量化。處理器用 SIMD,一次對欄存跑多個 batch。人會以為壓完查起來更慢。他把壓縮跟向量化放在一起時,看過查詢加速十倍、一百倍、到一千倍。

列存常見的 B-tree 之外,還有 sparse index,像 min max 跟 Bloom filter。查詢可以先讀 batch 或 chunk 上的 metadata,不必下到每一列,也不必先解壓縮。加總、取第一筆、取最後一筆,時序裡很常見,會快很多,因為讀的是 metadata。

遷移很短。幾個指令,把普通表轉成 hypertable,或從零建一張。之後插入或搬資料,系統依 timestamp 放進對的 chunk。

彙總自己更新,離線回補會重算整段

時序另一個日常是彙總:按天、按週,或同一份資料要好幾個粒度。vanilla Postgres 可能用 materialized view、stored procedure,或應用程式自己算完倒進表。

Timescale 往前做了 continuous aggregates。背後仍是 materialized view,會再建一張 hypertable,用 time_bucket 依時間範圍分桶。Brandon 說他總忘了 Postgres 裡對等的函式叫什麼。彙總依你設的政策自己更新:多久一次、往回補多遠。hypertable 有變動,彙總層跟著動。

人還常把它們疊成階層。裝置每一分鐘吐一筆,可以做五分鐘、一小時、一天、一週,四層彼此往上蓋,排程自動跑。他說這樣可以把幾千億列拆進時間桶,查詢落到很低的毫秒。Tiger Cloud 上有客戶,用他認為不算特別的硬體,每秒兩萬到三萬次查詢,一天打到幾十億次。

這裡也是現在還粗的地方。實體世界跟純粹追加寫入不一樣,裝置會離線。他們有一個做船運的客戶,裝置可以離線兩週到一個月,然後一整批資料突然回來,時間往回蓋兩週或一個月。materialized view 得把這麼長的一段全部更新,CPU 跟磁碟 I/O 都很重。refresh 政策要設對。他們打算加 granular refresh:tenant 可以是一台裝置、一個使用者,或你定義的單位。回補時只更新有變的那台,今天的 continuous aggregates 是整段時間一起更新。

改 chunk 大小只影響新的塊。舊的要用函式手動 split、combine。他們正在把這段的鎖定縮小。過程中若同時有 DDL、讀取或其他操作,鎖還是會卡住。開發者呼叫的就是這些函式。

想看底下在做什麼,主控台看得到。節目前半他把託管叫 Tiger Cloud,講產品線時又說 Timescale Cloud。雲上有 exporter 接到 Datadog、Prometheus。路線上,Postgres 既有指標之外,還要細到壓縮政策、continuous aggregate 的 refresh(他口裡的 CAG)背後在做什麼。SQL 沒有另一套。熟悉 Postgres 的人,要額外學的主要是 hypertable 跟 continuous aggregates。API 文件裡有函式可以碰到特定 chunk。產品開源,想看實作可以直接看程式碼。

熱的兩年留在庫裡,八年撕到 S3

開源把 extension 插進正在跑的 Postgres 就有。KBall 問,硬體也不用很華麗,為什麼還上雲。

Brandon 先講託管,把維運從團隊身上拿掉,類似他以前為地理空間產品大量用過的 AWS RDS。上面有 read replica、HA replica,由他們的團隊管;外面坐一層連線用的 load balancer。單一台不夠,可以再加 read replica。

他特別點名 tiered data。想留很長的歷史,又不必全部維持隨時能查的熱資料。舉例:十年裡前兩年放熱的,另外八年分層出去。在 AWS,那八年會撕到 S3,背後以 Iceberg 放著。整段時間對外仍是一張表。查前兩年打熱資料;範圍超出這兩年,系統把結果合起來,十年都能查。自己做的話,得有歸檔方案跟搬資料的管線。這裡是設一條 tiering 政策,依日期自動往外搬。

他們也在往倉儲、分析庫、lakehouse 走。產品叫 Tiger Lake,他說正式版預計在錄這集的當年稍晚推出,當時還在 beta,做雙向連通。別的團隊常把資料放成 Iceberg,再推到 Snowflake、Databricks。雙向包括把資料拉進來,讓 Tiger Data 或 Timescale 變成儀表板用的營運庫,因為那裡要快;資料科學或分析團隊則用 Snowflake、Databricks,或 AWS 上的 Athena 消費同一份。合規也會要多份副本放在多個地方。不必自己建管線,打開功能,依你選的資料,Tiger Lake 自動寫出到 S3。Azure 上有對等做法。

他要的是人少管管線,時間放回業務問題,多個團隊用同一份資料。來源可以直接寫進 Postgres、寫進 Tiger Data,再往下游送;也可以某個團隊先寫進 S3,再拉進來變成能查的營運資料。他補了一句:AI 讓開發變容易,管線若還得自己顧,人就還是在搬資料。

七十 TB 壓到五 TB,才上得了 NVMe

新專案若本來就從 Postgres 開始,關聯式的東西都在。應用裡只要有時序、而且會長大,他認為一開始就用不會走錯。本地五分鐘可以拉起 Docker image,一行 curl 就能裝。時序條數即使不多,也可以先從這裡起。能見度這幾年高了,人比較敢在新系統直接上。

既有系統那一側,通常是量已經很大。查詢或寫入未必已經出事,光是磁碟足跡就痛。他說錄製前幾週跟 CERN 做了一場 webinar。CERN 之前用另一套資料庫,後來遷到 TimescaleDB。他們點出的數字,是強子對撞機跟 CERN 其他裝置的時序大約七十 TB。靠壓縮,足跡從七十 TB 降到五 TB,於是改放到更快的 SSD、NVMe SSD。七十 TB 原先攤在更多磁碟上,現在塞得進更快的碟,效能是預設就上來。壓縮讓人用更普通的硬體,多個使用者同時打的吞吐也好一些;量大的寫入若本來就吃緊,也一起受益。

同一套庫可以不另開向量資料庫。有 PG Vector,也有他們的 extension PG Vector Scale,資料集變大時把規模撐出去。向量嵌入可以跟其他資料、跟 hypertable 裡的時序放在一起。他們還寫了開源的 PG Text Search 做文字搜尋,看過的規模可以跟 Elasticsearch 放在一起比。文字搜尋加向量嵌入,可以做成混合搜尋。遙測裡常見的用法,是先用 metadata 或文字描述搜,再回到底下的讀數。否則可能得拆成向量庫、時序庫、關聯庫,再到應用層 join。放在一處,再加上壓縮,足跡也小。

KBall 說他訪問資料庫公司常問:為什麼是你們,不是 Postgres?Brandon 的答案是乾脆用 Postgres 做。這也是他加入的原因之一。開源,社群裡還有一大堆 extension 可以並排裝。

給 agent 的 fork,現在還得整庫複製

路線上,Tiger Lake 還要繼續做進 Snowflake、Databricks 的連接器。開發體驗要更接近開箱,少做調參,continuous aggregates 要更好設。CLI 跟 MCP 不只負責安裝。開發者常問:我怎麼知道設對了?他們想把解決方案架構團隊帶客戶時累積的判斷,做成能驗證設定的指引。

另一塊是 agent 對著資料庫做事。內部在做儲存引擎的下一步,叫 Fluid Storage。它是零複製的儲存:fork 不必先把底層資料拷一份,之後的變更再以 diff 疊上去。配上 CLI 跟 MCP,在 CI/CD 或 Jenkins 裡可以把正式庫很快 fork 出去。他說正式庫可以在幾秒或幾分鐘內 fork 出來,讓 agent 對著那份資料做事,用完再拆掉。碰的是正式資料,又不會把正式環境的效能拖下去,破壞性操作也不必直接打在正式庫上。

KBall 說他光為了 QA 就想要。應用程式的分支已經好複製,資料一重就痛:得先拷一份正式資料再改,多數環境很花時間。命令列今天已經可以 fork。痛在庫一大就得整份複製。EC2 上若是 EBS 撐著的資料,搬起來要很久。Fluid Storage 要改的就是這段;需要的話也可以用來拉 read replica。尖峰時把多台放在 load balancer 後面,流量過去再縮回來。

讓 coding agent 直接上手,是已經在做的事。學習曲線還在,所以有 CLI、MCP,以及 PGAI guide,用來引導 coding agent 用這些能力。Brandon 自己做過一個 side project,把整間智慧家庭的遙測收進來,用 MQTT 推進去。大半是把想要的東西描述給 coding agent,資料庫那側他甚至沒親手碰。schema、hypertable、continuous aggregate 都長出來,幾個小時就跑起來,再接回 Home Assistant。他覺得懂 Postgres、懂這些概念仍然有用;往下走,力氣會放在做東西。他們把生意放在實體世界,從資料中心到太陽能,裝置數跟吐出來的量都在爆,要留很長的歷史,又留住 Postgres 的開發方式。

現在還會卡的第一件事是 chunk 調對。資料要先進去夠多才調得準。雲端已經有一個引擎會建議怎麼切,他們想把建議搬回 CLI 跟 MCP。continuous aggregates 設對是另一個坎,尤其是離線回補。

地端還有第三條。開源 TimescaleDB、託管 Timescale Cloud 之外,他們在做 TimescaleDB Enterprise,給工業與實體世界的現場,是開源方案的地端版本,有自己的主控台,可以拉起帶 read replica 的 HA、連線 load balancing、備份。這些若自己組,得從開源開始,再疊 etcd、Patroni 和其他東西。Enterprise 想把這包直接給出來。

裡面有 Postgres connector。想試 TimescaleDB 或 Timescale Cloud,可以把 connector 指向自己的庫,即時複製想要的表,把 WAL 重放寫進去,並維持同步。正式庫繼續跑,旁邊平行試,不必先 pg_dump 再 pg_restore。同一條也用在 Enterprise 的分層複製。他舉正在合作的資料中心營運商:一棟建築裡不同的 pod,裡面是一堆 GPU。pod 往上收到建築,再收到企業。connector 可以跨層複製。有人在 pod 上監控,也可能有一組人在看整座運轉或整座資料中心,資料就往上走。

版本上,他們支援過 Postgres 15 到 18。他說錄這集當天,GitHub 上要出來的版本他以為是 2.29,會把 PG 15 標成棄用,留下 16、17、18,19 出來後也會跟上。本地可以到 TimescaleDB 的 GitHub,一行 curl 裝起來;也可以到 timescale.com 申請評估,有三十天免費,還附點數。他建議一開始就用 CLI 跟 MCP,把使用情境寫給 coding agent,工具會依文件裡的做法去建 schema。主控台裡也有精靈。住在命令列的人留在命令列;想少碰指令的,走雲上的主控台。

KBall 把 CLI 跟 MCP 當成第一入口:大家愈來愈用 coding agent 去摸工具,這條路得修好。Brandon 說工具不會停在起手。他們還在做除錯、驗證、把慢查詢指出來。他看到可以做出獨立的 agent,盯著資料庫跟系統,即時給建議。起手之後的監控,背後是同一套工具。

〈Software Engineering Daily〉-EP-Inside Google’s Database Infrastructure for the AI Era

https://softwareengineeringdaily.com/podcasts/inside-googles-database-infrastructure-for-the-ai-era/

Sylas Krishnamurthy 是 Google Cloud 負責資料庫的 VP of Engineering。他在 IBM 寫過 DB2,在 UC Berkeley 拿串流資料庫的博士,把博士題目做成公司賣給 Cisco,接著在 AWS 待了五年、帶過 Aurora MySQL 與其他 MySQL 引擎,2019 年進 Google。他說自己其實有兩份工作,一份是 Google Cloud 的交易型資料庫,另一份是進來之後才知道的:整個 Alphabet 的營運資料庫。Gemini、Gmail、YouTube 都跑在同一套系統上,Spanner 與 Bigtable。

主持人 Matt Merrill 是個資料庫愛好者,這一集聊了七十幾分鐘,從資料庫五十年的老契約,一路聊到 AI 把契約撐開之後,Google 內外各自發生了什麼事。Krishnamurthy 的判斷很一致:資料庫過去承諾的精確結果,正在被相關性取代;而工程師得學會活在一個非確定性的世界裡。

五十年的契約:不要弄丟資料,給出精確答案

他常開玩笑說,資料庫只有一份工作:不要弄丟存進來的資料,然後對查詢給出精確的答案。這兩句話撐了五十年。2024 年他在 Berkeley 演講前去查了 SQL 原始論文發表的日期,發現幾乎就是同一天,1974 年,跟他出生的年份一樣。

中間當然出現過各種嘗試,非關聯式系統、各種新型資料庫,繞來繞去。但有一條沒變,他把它叫 database dogma:使用者宣告自己要什麼,怎麼做到是系統的事。你講你要什麼,系統自己想辦法生出來,順便保證資料不掉。

另一條沒變的是效能、可用性、耐久性之間的連動。他說,長時間的效能事件實際上就是一場可用性事件,因為延遲拉長到某個程度,站點就等於掛了;長時間的可用性事件,實際上就是一場耐久性事件。三件事綁在一起。

變的部分有兩層。一層是過去十年企業 IT 的體質:以前企業 IT 是買套裝軟體、順便裝一套資料庫,現在不是了。開源軟體把最佳實務帶進企業,企業 IT 自己就很會做,也會對資料庫要求更多。市場上也分成兩條路線,演化式的 scale up 系統,跟革命式的 scale out 系統;Bigtable 是二十多年前 Google 自己做出來的,Spanner 是另一個。

另一層是最近三、四年 AI 帶來的。結構化與非結構化資料開始被放在一起問,資料庫的工作就開始像搜尋,用學術的話說是資訊檢索(information retrieval)。精確結果不夠了,你要給的是最好的結果,相關性與排名變成第一等公民。他說,這不只是資料庫的事,當系統開始產出非確定的結果,你設計系統的方法就得整套換掉。

取捨也開始分家。掉幾個 click event 跟掉一筆金融交易,代價完全不同;有些系統可以選擇不同的約束,這本質上是成本、效能、延遲的取捨。資料庫不再有一套打天下的答案。五十年的契約沒有被廢掉,是第二句話正在被改寫。

Spanner:為了讓廣告系統離開分片倉鼠輪

Spanner 的起源是廣告系統。它大到必須分片,跑在分片的 MySQL 上;每年都要花大量時間想系統接下來要怎麼長,然後動手分片。到了 2008、2009 年左右,他們得到一個結論:等他們分完片,世界又變了。這是一個跑不完的倉鼠輪。

廣告是典型的企業應用。表有成千上萬張,而且不只一個應用。相對地,跑在 Spanner 上的一些消費性服務,DDL 打開來看,十五張、二十張表,盯著看還能看懂。

所以他們要的東西是三件一起來:企業應用的功能、Google 等級的規模、還有當時沒人解過的全球部署。強一致性、交易語意、次要索引,這些是關聯式資料庫的開發者視為理所當然的東西;把這些跟 scale out 的世界放在一起,之前沒有人解出來。Spanner 在 2012 年於 Google 內部進入正式生產,服務的就是廣告系統。

那一般開發者什麼時候該用 Spanner?他說得很乾脆:如果單節點就跑得動,Postgres 很好;需要一堆 replica,Postgres 也還撐得住。Spanner 給的是組合。同步的多區域配置、能隨時擴張也能隨時縮減的規模,還有多模:同一套系統裡有圖、有全文搜尋、有向量搜尋。

他也補了一句,Postgres 這幾年的演化裡,圖資料庫、全文搜尋也慢慢長進去了,所以這些能力最後可能大家都會有,Google 只是稍微早了一點。真正獨特的還是規模、跨區域,跟擴縮的容易程度。

Spanner Omni:一支 binary,沒有原子鐘的 TrueTime

Spanner Omni 要解的是「客戶不在 Google 機房裡」這件事。

第一個理由是銀行這類高度監理的客戶。他們要業務持續性,或者監理機關直接要求:萬一要「壓力退出」,你得有能力回到自己的資料中心跑。他轉述一位銀行客戶的抱怨:那位客戶要把系統從兩個半九(2.5 個 9)的可用性搬到四到五個九,不管單區域還是多區域都更好,結果監理機關要他解釋為什麼要搬。Krishnamurthy 說他也理解監理機關的立場,資料在多個地方有連續性確實重要;但這個「沒有選項」的缺口,實實在在擋住了客戶上 Spanner。很多人說我想押這個注,問題是我要怎麼拿到選項。

第二個理由跟 AI 有關:客戶在到處搶容量與基礎設施。雲端已經不是單極世界,有好幾家供應商,生態很熱。他也提到,以前的雲廠商連 hybrid 這個詞都不愛講,你在某些公司甚至不能用這個字;但客戶的現實不是那樣。客戶手上有很多基礎設施,有時是為了選項,有時是因為生意做大了就是靠併購與整合長出來的。錄音前幾週他在一場客戶諮詢論壇上,聽到一位客戶很激動地說,他們的皇冠珠寶會留在自己的資料中心。他認為這就是 2025、2026 年的現實:複雜、混亂,你得回應這個混亂。當然也有一種客戶,就是因為全世界找不到第二個像 Spanner 的東西,非要它不可。

工程上的故事更硬。在雲端,Spanner 是一堆 microservices 有機演化出來的,Google 自己知道怎麼操作。要讓別人自己跑,第一件事是把操作簡化:他們把所有東西收成一支 binary,你可以跑在筆電上、跑在某個部署裡、指定幾個節點就開跑。主要是 C++。他說聽起來很簡單,做起來非常難,整個團隊花了兩年,快得驚人。他開玩笑說,也許哪天 AI 會幫忙把它全部改寫成 Rust。

儲存層也得重新想。在 Google 內部,Spanner 站在 Colossus 上面。那是一個分散式儲存系統,分區(zonal)的服務,全世界沒有第二家有。靠著它,Spanner 要 split 或 merge、要擴出去的時候,只需要複製 metadata,不用搬資料;別人得留著資料的副本,於是在有負載的時候把資料搬來搬去。他把這個叫超級能力,也說這是 Spanner 與 Bigtable 比別人強的原因之一。出了 Google,這層就沒了,所以儲存要重新建模,用上一堆聰明的技巧。

再來是時間。要讓全域複製的系統跑分散式交易,你得對時間有辦法推理。Google 的作法是在資料中心放特製的硬體原子鐘,用來壓低他所說的 epsilon,也就是不同參與者時間之間的差。交易的語意取決於這個差:commit 要等多久、各個參與者的時間概念怎麼對齊。差壓得夠低,Spanner 在 Google 內部就跑得像飛。

那出了 Google 呢?他說外面的時間原語(time primitives)比十五年前好太多了,有一部分還是 Spanner 教會大家的;當然比不上 Google 機房裡的硬體鐘,但大概不會比 Google 自己在 2012 年的水準差到哪裡去,而 Spanner 就是為那個世界設計的。所以他們做了 Software TrueTime,可以跑在其他雲、也可以跑在舊的資料中心。有些面向不會跟在 Google 內部一樣好,但他相信對很多使用情境來說,夠用了。他還提到有客戶問:我們能不能在自己資料中心裝一樣的原子鐘?他的回答是「來談」。他說今天資料中心怎麼蓋,很多是來自 Google 過去二十幾年的功課,這些經驗會流到更大的生態裡;撇開他在 Google 的身分,他覺得這對整個產業是好事。

原生圖:在交易資料庫裡跑 PageRank

Spanner 現在可以讓你把資料直接當圖來用,而且不用搬資料。資料留在關聯式 schema 裡,你在上面疊一層:一行 DDL 建立 property graph,接著就能像查圖一樣查它。也可以選擇純圖的介面。查詢還是宣告式的,這點沒丟:幫我找出距離兩跳、三跳、四跳的所有節點。Database dogma 還在。

適合的場景都是關係很多的地方。基礎設施裡的 port 跟網路交換器、安全領域的使用者與帳號、trust graph、customer 360、詐騙偵測。他說最關鍵的好處是不用跑一條麻煩的 ETL,就能對營運資料問更複雜的問題,在原地問完。資料當然可以搬出去、用 pipeline 在某個地方問,但你想要那樣嗎?

圖演算法是後來的事。Google 在內部為了網頁相關的問題,做這些演算法做了幾十年,後來發現它們可以整批轉到客戶的圖問題上。詐騙就是最典型的一個:洗錢或合成身分詐騙,背後常常是一整片共謀的帳號網路。詐騙集團建出複雜的帳號與交易網路來模糊行蹤,而且一直在動。這是貓抓老鼠的軍備競賽。如果你的做法是把營運系統的資料搬到另一個系統再跑,詐騙集團早就移動完了。一筆一筆看交易,也看不到那個協同的全貌。

Spanner Graph 的作法是把帳號當節點、交易當邊,然後在系統裡直接跑社群偵測的演算法:weakly connected components、modularity clustering,找出彼此相關的帳號叢集。找到可疑叢集之後,要再往裡面找誰是關鍵角色,他直接說,這就長得跟 PageRank 一模一樣,實際上就是跑 PageRank。PageRank 當年是給網頁用的,但它在「找出網路裡最有影響力、最核心的節點」這件事上非常好用。於是你不只找到共謀的那一群人,還能看到其中的關鍵人物。

印尼的數位支付公司 DanaPay 就是用 Spanner Graph 做反洗錢。演算法直接在 Spanner 裡跑,不用等 ETL 週期,可以更快找到可疑網路、指認裡面的關鍵角色,而且能即時標記或阻擋交易,避免財務損失與後續的作業負擔。

他的收斂是這樣:一般交易資料庫不見得需要 PageRank,但你真正需要的,是對「新鮮營運資料裡的關係」有快速、可動作的情報。他也提到 SoundCloud,說他們跑圖演算法跑了幾年,都是批次在跑;很多時候大家以為那是唯一的方法。他還說,每次多給開發者一點東西,他們就會找出你沒預期到的用法。

Schema 之外,agent 要的是脈絡

以前專案裡第一個難題是選哪個資料庫、資料怎麼放。現在 LLM 什麼資料都吞,agent 還會自己寫查詢。所以 schema 設計還重要嗎?他很坦白:我們不知道所有會變的東西,這件事變得太快。但有一件事是確定的,為數龐大的既有應用不會一夜消失,而它們有迫切的需要被 agentic 應用用上。在你煩惱 schema 要不要改之前,更急的是怎麼把這些資料庫「點亮」。

他的講法是 agentic data cloud 有三塊。第一塊是 AI 原生的基礎設施:圖、向量搜尋、全文搜尋,因為結構化與非結構化資料正在合流。第二塊是把摩擦拿掉,讓世界沒有邊界:跨雲的 lakehouse、Spanner Omni、給 Postgres 應用用的 AlloyDB Omni。第三塊是信任,而信任的意思是脈絡:你得知道系統裡到底有什麼。

將近三十年前他在 DB2 團隊時,一直不懂 SQL 標準為什麼要讓你能替一個物件加上一段 comment。當時看起來很理論、很累贅。現在這東西有意思了,因為它可以記錄某個東西的意思;但現實一點講,他覺得不會有人真的靠 comment。你要另外想辦法蒐集 schema 的資訊。

他舉了兩個很小的例子。一張表裡有 billing address 跟 shipping address 兩個欄位,如果其中一個是 null,背後有一個沒有寫在 schema 裡的隱含知識:這兩個其實是同一個。那個知識要被抓出來,那才是關鍵脈絡。又或者有個欄位叫 city,值是小寫嗎?是三個字母的機場代碼嗎?一個要生成 SQL 的 agent,得先知道這件事。所以,schema 重要,但脈絡更重要;只有 schema 並不夠。

AI 會不會設計出不同的 schema?他不覺得。AI 會照人類過去設計的方式設計,因為它就是被那些東西訓練出來的,模型會傾向挑同一種結構。他也不太相信「生成者是 AI 還是人」會讓 schema 設計的通則產生根本變化。有人跟他說,他們現在沒那麼在意程式碼的抽象了,反正叫 AI 複製一份改一改就好;他覺得那條路通往更多混亂。

倒是應用的定義在變。今天一個應用有四面牆,有邊界、有 API 介面。新的世界裡,應用會變成免洗的 workflow,那個「應用資產」本身不存在。早上一個知識工作者進辦公室,手上有系統 A 跟系統 B,想湊出一張合併兩邊資訊的採購單。以前的作法可能是跟大型系統整合商簽約、付一大筆錢,半年後才有結果;現在他直接叫 AI 去做。而這些 agent 互動的軌跡得存在某個地方,這就是新的資料問題。系統也得更有彈性:出國前打電話給銀行設個詐騙警示,卡片才不會被擋;那如果你辭掉工作,決定在東南亞每個國家各待一週、三個月後再回來呢?你可能想要越南一週、寮國一週、柬埔寨一週,設二十個不同的警示。銀行系統大概會噎住,因為當初設計的人沒想過這件事。所以 schema 該不該更往前看、更有彈性?他把這當成一個還開著的問題。

寫入先提案,不要直接改

目前整個業界都很保守:大部分只做讀,因為大家都怕。沒有人想在自己家重演 Bobby Tables 那類事故,一句塞進去的查詢就把資料刪光;恐怖故事已經有了,安全與信任沒想清楚,壞事就會發生。

寫入難在哪?agentic 應用、這些免洗 workflow,要怎麼寫入、怎麼改 schema,他說並不清楚。他的提案是:當你要對資料庫做一個變更或修改時,不要真的做那個變更,而是產生一個「變更提案」(proposed change),它不會當場生效,可能要走過一組步驟。他認為資料被改、schema 被改的整套方式,都還會再修。

既有應用不會一夜消失,商業邏輯住在應用裡,所以還是得把它們接上這個新世界。

主持人在這裡補了自己的立場:他願意讓 agent 寫很多應用程式碼,但他在資料模型這條線畫下去。Agent 可以提案、可以試著做,但他會狠狠審一遍,用自己的經驗、對未來的判斷跟創意去壓力測試。Krishnamurthy 說這跟他的看法一致。資料模型這條線,目前還是留給人守。

PGVector 之後:filtered vector search 才是真問題

每個 AI 新創的技術棧看起來都是 Postgres 加 PGVector。Krishnamurthy 自己是 Postgres 的愛好者,當研究生時就寫過 Postgres 的程式;他說 PGVector 很棒,好用,整個 Postgres 的擴充生態讓實驗可以一直長出來,搭上 HNSW 演算法在很多情境下都很好用。

但 Google 做向量搜尋超過十五年了,YouTube 與搜尋的底層都有它。他們的技術叫 ScANN,樹狀結構的演算法,可以撐到一百億顆向量以上,延遲表現比單純的 HNSW 好得多。他們把 ScANN 放進 AlloyDB,並且讓它用起來像 PGVector;同時也保留原版的 PGVector,應用程式不用改,跑在 PGVector 上的東西也能跑在 ScANN 上。

數字是這樣:在他們的測試裡,向量查詢比標準 Postgres 上的 HNSW 快六倍,記憶體少用四倍。記憶體這件事對資料庫特別實在,省下來的會進到 buffer cache,效能又跟著好。他們也支援分散式索引建立,也支援 HNSW,還把一些 ScANN 的改進搬了過去。至於這些有沒有回饋到上游開源專案,他說他不確定,不想講不準確的話。

他把向量搜尋看成一種「ensemble」問題:有些情境 HNSW 就夠,而且更簡單;但最高階、最大規模的工作負載,真的需要 ScANN 這類東西。兩邊都有價值。

真正麻煩的是 filtered vector search。很少有人問一個純向量搜尋的問題,實務上查詢會帶多個條件:一個語意搜尋的條件打在向量索引上,另一個是一般的關聯式條件,例如目錄裡的價格。於是你得決定先探哪一個索引。先探向量索引(後過濾),可能拿到二十筆,套上價格低於五十塊,一筆都不符合;再要下二十筆,還是不符合,只能一直往下撈。改成先探非向量索引(前過濾),可能一次拿到一百萬筆,而一百萬筆根本跑不動最近鄰搜尋,那正是你當初做向量索引的原因。哪一種策略對,取決於選擇性,而你在事前不知道。

AlloyDB 的解法是把兩個索引放在同一個系統裡,所以它可以同時探兩邊,很快判斷哪個順序對,並且在過程中隨時換策略。主持人問這算不算分而治之,他說不算,這是一種自適應的技巧:先試幾種,再依你當下的實際狀況調整。

他也不建議另外外掛一套純向量的系統。如果只是對一批不太變動的文字語料做純向量搜尋,那或許合理;但只要開發者蓋完這種系統,幾毫秒之後查詢就會變複雜。向量系統一旦分家,你就要在應用層把兩個系統縫起來,而前過濾、後過濾要誰來做?他說純向量系統對這件事沒有好答案;多個索引在同一套系統的控制之下,才做得出這種聰明的東西。他們另外也把高速向量檢索跟營運資料上的全文搜尋合在一起,混合搜尋(hybrid search)就變得有意思了。

MCP Toolbox 與 managed MCP:兩條路

Google 釋出了 MCP Toolbox for Databases,開源,本質上是一台架在資料庫上面的 MCP server,AlloyDB、Cloud SQL、Spanner 都能接,開發者不用自己從頭刻。另外也有 managed MCP 服務,企業等級、有治理機制。

他自己的團隊是在做資料庫跟基礎設施的,不太用 MCP;但有個地方會用,就是使用者介面。Google Cloud 的代管資料庫本身也是一個應用,實例與資料庫的資訊存在內部的 Spanner 裡。以前每次做一個新功能,就得做一大堆複雜的 UI;現在他們改成連上 MCP 服務,依使用者問的問題即時生成介面。他說這不只是省時間,還能生出更貼著使用者需求的體驗。他也補充,這個 Generative UI 沒有正式的對外名字,他不小心用了內部的專案代號;類似作法在資料庫 console 的觀測性功能裡已經有了。

機制是這樣:他們的 UI 基礎設施本來就有一堆 widget,於是一邊把底層系統接上 managed MCP,一邊把這些 UI widget 也包成 MCP 工具,模型就能自己決定要怎麼組合。他說任何客戶都可以做一樣的事。真正麻煩的地方,還是回到那個老問題:什麼是讀、什麼是寫,以及你有多準備好讓 agent 寫進營運資料庫。

兩種開發者走兩條路。走在最前線的開發者會用 MCP Toolbox,因為他們需要自訂的身分驗證機制,可能還跑在自己的機房、根本不在 Google Cloud 上。Toolbox 一開始要解的問題就是:不管你人在哪裡,都讓你更容易接到資料庫;開放性是 agentic data cloud 的一部分。在 Google Cloud 裡,managed MCP 是另一條路:控制平面的操作(agent 去建資料庫、跑應用、部署應用)、還有自訂工具(不是下 execute SQL,而是像「查一個航班」這種工具,背後去跑一句特定的查詢)。他也說,他們在 Toolbox 上學到的東西,只要有價值,就會進到 managed MCP。

讓 LLM 接上正式資料庫:PSV、隔離、觀測

主持人開場就說,一個 LLM 接著你的正式資料庫,這是一個等著發生的恐怖故事。Krishnamurthy 的答案從一個對比開始:分析型系統跟營運型系統是兩個世界。

分析型系統裡,進來的人可能是商業分析師或資料科學家,用自己的憑證連線,存取控制長在系統裡,他們通常能看到比較廣的資料,而且 BI 查詢本來就是聚合查詢。營運資料庫不是這樣。1990 年代初期,主從架構的胖客戶端直接連資料庫,終端使用者的憑證真的在裡面;到了 1990 年代後期,網頁與三層式架構把這件事徹底改掉。今天在營運資料庫的 schema 裡,根本沒有終端使用者這回事。資料庫有使用者、角色、群組、權限,但終端使用者不在裡面。原因之一是人數:有了網頁之後,終端使用者從幾百個變成幾千個、幾百萬個、上億個,你沒辦法那樣管。於是應用程式用一個 service principal 連上資料庫,某個登入使用者能看到什麼,是散在應用程式各處 SQL 的 WHERE 子句決定的。

現在你讓一個 agent 用這個看得到全部資料的 service principal,替任何一個使用者問問題,問題就來了。他舉例,一家租車公司如果有兩千個分店,每個店經理應該只能問自己店裡的車。

解法是 parameterized secure views,PSV,建築在 Postgres 的 secure view 上。Postgres 的 secure view 有一個 security barrier 的特性:沒有它的話,你可以用資訊理論的手法把資料挖出來。作法是寫一個會讓系統爆掉的查詢,例如帶 WHERE 子句的除以零;沒擋住的話,查詢優化器會太聰明,把條件推到表裡面去,於是你得到一個錯誤、或得到一個空結果,而那個錯誤本身就洩漏了資訊。security barrier 確保條件不會被推進表裡。

PSV 再往前一步:加上參數。這個參數基本上就是原本散在應用程式 WHERE 子句裡的那道授權檢查,只是現在你把它定義在 schema 旁邊的 DDL 裡。Agent 用的 service principal 只碰得到 PSV,碰不到底層的表;登入使用者的憑證從一條側通道進來,綁到那個參數上。你可以攻擊 LLM、可以騙它、可以讓它生出任何它想生的查詢;查詢送到的時候,它永遠只會看到那個使用者的憑證允許它看的那些列。他說這是關鍵的基礎設施,沒有它,做不出 agentic 應用需要的那種安全。主持人把它翻成一句話:你不需要把角色塞進資料庫,是把原本寫在應用程式裡的查詢,搬進 DDL。

他還把這件事接回 1975 年的一篇經典論文,end-to-end argument in system design。他在 Berkeley 開始讀博士時讀到,論文的意思是:分散式系統要談加密、談安全,你得在系統的兩端解決,不能在管子裡解決。同樣的道理搬到這裡,安全得坐在資料那一層,因為我們活在一個 agent 什麼都做得出來的非確定性世界。

另一半是隔離。分析查詢打交易資料庫本來就會互相傷害,這也是為什麼大家會把資料卸載出去;Google 花了很多年處理這件事。他轉述一位銀行客戶的反應:我們花了好幾年確保批次掃描不能打在營運資料庫上,現在你要我在上面跑 agent?你瘋了嗎?他說這問題問得對。Agent、甚至一整群 agent 在問問題,同一堂課還是要再上一次:agentic 應用要被隔離。而且可能更麻煩,因為 agent 不好控制,它會跑爛查詢,也會跑惡意查詢。

再來是觀測。他說你需要的觀測性要細到這種程度:你能不能對著你的 Postgres 資料庫問,把 agent 來的查詢跟應用程式來的查詢分開列給我。有了這個,才談得上在周圍架護欄。主持人說這幾乎就是對資料的即時威脅偵測。

誰 commit 誰負責,然後接受混亂

主持人提到他先前的說法:Google 的工程師想用多少 AI 都可以,但程式碼是誰 commit 的,責任就歸誰;節目裡也提到,Google 現在大約有四分之三的新程式碼是 AI 生成的。Krishnamurthy 的反應很老實:三個月後會怎樣,他真的不知道。但他確定一件事,六個月前的先驗假設現在該重新檢查一遍,能做的事情比大家想的多。

不過數字要小心,因為變異非常大,取決於你在講哪一種程式碼。他的直覺是:像 Paxos 這種分散式共識協定,也就是 Spanner 的心臟,大概還是很難讓 AI agent 直接大改,他們也會非常小心。而「AI 生成的程式碼」是一個連續光譜:一端是在 IDE 裡做例行重構;另一端是一整個 pull request、一整塊自成一體的程式碼,而寫的人從頭到尾沒有進過 IDE。

他們在團隊裡的做法是因材施教:針對每一群做同一件事的工程師,建對應的 harness 與技能,然後量測。就像 AI 與 agent 世界裡的每一件事,關鍵是 evals:你需要一個客觀的方法知道它到底有沒有在動。他說這對大部分人應該都適用。

還有一件事他特別強調:留空間給實驗。挑一個專案,專門用來推你在 AI 上能推到多遠。撞到瓶頸的時候,工程師的慣性反應是切回原本的做法,把問題解掉,因為我們被要求的本來就是把事情做完;但他認為也需要有一部分努力是這樣:撞到瓶頸就修瓶頸,不要繞過去,並且接受交付會變慢。

最後他給的那個總結是這樣。他們花了二十五年學怎麼蓋確定性、可規模化的系統,確定、可預測幾乎變成信仰。現在是一個不同的時代,資料是亂的、不再確定。他觀察到很多人像在走悲傷的五階段:一開始都在吵怎麼把 AI 弄成確定性的,他覺得那條路不會成功。兩個世代的軟體工程師都照舊方法訓練出來,產業得接受自己身處混亂,然後與它共處。至於怎麼在混亂裡看懂事情,還是回到他前面講的:用 evals 去看品質與商業結果。因為資料庫真正變掉的那件事是結構化與非結構化資料一起進來,而它要交付的東西,已經從精確結果變成最相關的結果。主持人接話說,已經沒有對或錯的答案,只有一片相關性的光譜。Krishnamurthy 說,對,而我們全都還在那片光譜上的某個位置。