試想一個(gè)普通工作日,你接到業(yè)務(wù)方需求,要從幾百萬行日志里用正則撈出特定錯(cuò)誤碼。你熟練地敲下WHERE列 ~ 'Error\s[0-9]{4}',然后端起咖啡等結(jié)果。五秒過去了,沒動靜;十秒過去了,客戶端還在轉(zhuǎn)圈。你開始懷疑索引沒建對,或者數(shù)據(jù)庫剛做了垃圾回收。其實(shí),真正的瓶頸可能藏得更深——Postgres內(nèi)置的正則表達(dá)式引擎,正在用上世紀(jì)的回溯算法,把你的每一次匹配變成一場CPU長征。
這種場景并不罕見。因?yàn)镻ostgres原生的POSIX正則實(shí)現(xiàn),本質(zhì)上是基于“回溯”來工作的。它的行為就像走迷宮時(shí)每遇岔路就鉆一條,走不通再退回分岔口試另一條。對于復(fù)雜模式和長文本,這種試探次數(shù)可能急劇膨脹,而你感受到的就是“這個(gè)查詢?yōu)槭裁绰秒x譜”。有意思的是,同樣的問題也曾困擾過ClickHouse團(tuán)隊(duì),而他們的回應(yīng)很直接:既然回溯不靠譜,那就換一套不會回溯的引擎。
于是,他們把自己在ClickHouse里深度依賴的RE2正則引擎,打包成了一個(gè)Postgres擴(kuò)展,取名pg_re2。RE2背后的原理,是用有限自動機(jī)來取代回溯,就像把迷宮改造成一張一次性標(biāo)注所有可能路徑的路線圖,匹配過程變成機(jī)械的狀態(tài)跳轉(zhuǎn),執(zhí)行時(shí)間幾乎不受模式復(fù)雜度影響。Russ Cox在2010年公布RE2時(shí),給出的論斷至今讀來仍很犀利:用自動機(jī)理論去實(shí)現(xiàn)一個(gè)現(xiàn)代正則庫,不但在運(yùn)行時(shí)長上給出更強(qiáng)保證,還能支持那些靠臨時(shí)湊出來的回溯實(shí)現(xiàn)根本做不了的高階分析。
既然底層算法換了個(gè)物種,性能結(jié)果自然很有看頭。pg_re2官方提供的基準(zhǔn)測試,在AWS m6g.2xlarge實(shí)例和PostgreSQL 18上,把RE2版正則函數(shù)和Postgres原生函數(shù)做了正面PK。結(jié)論很干脆:RE2在所有測試場景均勝出,加速比從1.8倍一路沖到8.6倍。最亮眼的兩項(xiàng)是extract_all類操作,直接帶來了7.2到8.6倍的提升。這里有個(gè)背景值得說明:Postgres原生的regexp_matches(..., 'g')函數(shù)因?yàn)橐祷丶希瘮?shù)調(diào)用開銷會額外拖累速度,而pg_re2的extract_all返回?cái)?shù)組,省去了這層包袱,所以差距顯得尤其夸張。說是“不公平對比”也行,但對實(shí)際使用者來說,快就是快,管它公不公平。
光是原生函數(shù)提速還不夠,索引層面也得把差距拉滿。pg_re2從0.4.0版起引入了新的匹配操作符@~,作為Postgres原有~操作符的替補(bǔ),并順勢提供了btree和GIN索引支持。目的是讓RE2正則匹配也能走索引,而不是動不動就掃全表。第二輪基準(zhǔn)測試對比了RE2對標(biāo)Postgres正則索引的表現(xiàn),結(jié)果照舊:RE2全贏,加速1.1到1.8倍。值得留意的是,當(dāng)針對btree索引做前綴匹配時(shí),提升幅度和直接表掃描差不多,因?yàn)閮烧叩讓佣际窃谟迷紙?zhí)行速度碾壓索引條目。換句話說,不是索引有多神奇,而是RE2本身的執(zhí)行動作實(shí)在太輕了,從表掃模式切到索引模式,就已經(jīng)能省出一大截時(shí)間。
安裝pg_re2的姿勢毫無門檻。一條CREATE EXTENSION re2走完,馬上就能用@~測試:SELECT 'HouseQuake' @~ 'Quake\b',立刻返回t。對那些被Postgres正則性能長期困擾的用戶來說,這個(gè)瞬間或許會讓人生出“早干嘛去了”的感慨。擴(kuò)展本身可通過PGXN或GitHub獲取,如果你用的是ClickHouse Managed Postgres,服務(wù)里已經(jīng)自帶,不用手動折騰。
回到開頭的那個(gè)工作日場景:當(dāng)你把原生正則操作符悄悄換成@~,同樣的日志過濾在1秒內(nèi)跑完,咖啡還沒涼。千萬別誤會這不是魔法,純粹是換了副引擎。ClickHouse把自家看家的RE2包裝成Postgres插件,折騰的不單是點(diǎn)點(diǎn)函數(shù)替換,而是在向Postgres生態(tài)拋出一個(gè)信號:有些被默認(rèn)選項(xiàng)掩蓋的速度窟窿,只要不認(rèn)命,就能用靠譜的算法理論給填上。那下次正則查詢再讓你血壓升高時(shí),或許可以試試這句:CREATE EXTENSION re2;
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.