安德鲁·邓斯坦:又一个PostgreSQL的JSON解析器

安德鲁·邓斯坦:又一个PostgreSQL的JSON解析器

💡 原文英文,约1000词,阅读约需4分钟。
📝

内容提要

PostgreSQL引入了两种JSON解析器:最初的递归下降解析器和后来的非递归预测解析器。后者支持增量解析,尽管速度较慢,但在处理大型备份清单时更有效。最终决定同时保留这两种解析器,以满足不同需求。这项工作将包含在PostgreSQL 17中。

🔎

延伸解读

为何需要两种JSON解析器

PostgreSQL最初为JSON数据类型引入了一个简单的栈式解析器,仅用于验证JSON格式。后来为了支持数据提取等操作,又引入了递归下降解析器。但递归下降解析器无法处理增量解析,因为其状态保存在调用栈上,无法在分块输入时恢复。因此,为了处理大型备份清单,作者实现了非递归预测解析器,它使用显式栈,可以保存和恢复状态,从而支持增量解析。最终决定同时保留两种解析器,以满足不同场景的需求。

非递归解析器的性能代价

非递归预测解析器虽然支持增量解析,但速度比递归下降解析器慢约60%。这是因为CPU对调用栈的建立和展开非常高效,而显式栈操作需要更多指令。作者和他人尝试优化,但未能消除差距。因此,PostgreSQL仅在解析备份清单时使用非递归解析器,因为该场景对性能要求不高,而增量解析大型清单的能力更为重要。其他场景仍使用递归下降解析器。

对PostgreSQL 17用户的影响

这项工作将包含在PostgreSQL 17中。对于大多数用户,JSON解析行为不变,仍使用递归下降解析器。但备份清单的解析将改用非递归解析器,以支持增量处理,从而更高效地处理大型清单。此外,其他需要增量解析JSON的用例也在开发中。因此,用户无需担心性能下降,因为非递归解析器仅用于特定场景。

❓

Q&A

PostgreSQL的JSON解析器有哪些类型?

PostgreSQL有两种JSON解析器:递归下降解析器和非递归预测解析器。

非递归预测解析器的优势是什么?

非递归预测解析器支持增量解析,适合处理大型JSON文档。

为什么需要开发新的JSON解析器?

因为现有的递归下降解析器无法处理增量解析,无法有效处理大型备份清单。

非递归解析器的速度与递归下降解析器相比如何?

非递归解析器的速度比递归下降解析器慢约60%。

PostgreSQL 17中将包含哪些新功能?

PostgreSQL 17将包含同时保留递归下降解析器和非递归预测解析器的功能。

如何处理大型JSON文档的解析?

使用非递归预测解析器可以增量解析大型JSON文档。

🏷️

标签

➡️

继续阅读