資料庫開發社群正在積極討論 DuckDB 計劃從傳統的基於 YACC 的 SQL 解析轉向更現代的解析器表達文法(PEG)方法,同時也分享了關於市場上現有替代解析方案的寶貴見解。
社群反響與替代方案
DuckDB 解析器現代化的公告引發了開發者們的熱烈討論。一些人讚賞該專案的持續創新,而另一些人則指出了現有的成熟解決方案。其中特別值得注意的是來自 datafusion 的 sqlparser-rs,它因全面支援各種 SQL 方言,尤其是在處理 Microsoft SQL Server 的獨特語法需求方面獲得了廣泛認可。
從實用角度來看,對於當前需要解析 SQL 的開發者,我推薦使用 datafusion 的 sqlparser-rs... 就支援各種 SQL 方言的特殊語法這一點而言,我不知道還有什麼其他解析器能達到它這樣的支援水平。
關於現代化的技術爭論
社群對現代化論點提出了深思熟慮的反駁。一些開發者認為,技術的年齡不應該成為替換它的主要理由。他們強調,許多20世紀60年代的計算概念至今仍然有價值且行之有效。討論指出 LALR(1) 解析器可以實現執行時擴充套件,這表明應該基於技術優勢而不是年齡來評估 PEG 的優勢。
效能對比:
- TPC-H 查詢1的 YACC 解析時間:約0.03毫秒
- 同樣查詢使用 cpp-peglib 解析時間:約0.3毫秒
- 大檔案(36,840行)解析:
- Postgres(YACC):24毫秒
- cpp-peglib:266毫秒(不包含動作),339毫秒(包含AST生成)
教育資源與學習機會
社群成員推薦了一些有價值的學習資源,供那些對 PEG 實現感興趣的人參考。Ian Henry 編寫的免費書籍《Janet for Mortals》被推薦為學習 PEG 概念的優秀入門材料,一些開發者指出這本書影響了他們對程式設計的觀點和對解析技術的理解。
效能考慮
雖然文章討論了 YACC 和 PEG 實現之間的效能差距,但社群似乎對報告的10倍速度下降並不太擔心,特別是在分析查詢中,解析時間只佔整體查詢處理時間的很小一部分。關注點似乎更多地集中在功能性和可擴充套件性上,而不是原始解析速度。
這場討論反映了資料庫技術的一個更廣泛趨勢,即開發者們正在權衡傳統的久經考驗的方法與現代的、更靈活的解決方案之間的利弊,後者能更好地適應查詢語言開發的未來創新。