本文探讨了在数据库查询语言中使用递归时发生的“非终止”问题,以及控制它的评估策略的重要性。
想象一下,你让秘书“找出所有你最好朋友的朋友”。秘书会检查朋友名单,然后又检查这些朋友的朋友名单。但是,如果朋友关系是环环相扣、循环结构的呢?秘书可能永远都在忙这件事而无法下班,而你可能永远都收不到结果。
在计算机科学中也会发生类似的事情。当我们使用“查询语言(Query Language,用于检索或操作数据的语言)”来从数据库获取信息时,如果加入了“递归(Recursion,一种反复调用自身的方式)”这个强大工具,程序就可能停止运行,无法结束。计算机科学家称之为“非终止(nontermination)”问题。
这为什么很重要?
在我们日常使用的智能手机应用或网页服务中,在不为人知的地方都在执行大量的数据库查询。如果这些查询无法正常结束,持续占用系统资源,应用程序就会“卡死”。特别是当今的AI服务或推荐系统,为了识别人员关系或信息连接点,会处理更加复杂的数据结构。数据越复杂,计算机决定“从哪里开始如何处理”的顺序,就越成为决定服务稳定性的核心问题。
轻松理解:评估顺序的秘密
简单来说,计算机处理指令的方式——“评估策略(Evaluation Strategy,计算表达式的规则)”,就像厨师决定烹饪顺序一样。 출처 14
例如,假设我们要为三位朋友准备一场晚宴。
- 从左到右(left-to-right): 严格按照菜单顺序一道一道地烹饪。
- 非确定性(nondeterministic): 按照食材准备好的顺序,拿起什么就做什么。
- 并行“and”: 同时开始烹饪三道菜,每道菜都处理一点。
在查询语言中加入递归时,以何种顺序遍历数据也至关重要。就像烹饪顺序可以决定菜肴的成败一样,选择不同的策略可能会导致查询成功给出答案,也可能陷入无限循环。 출처 1, 출처 3
在传统的数据库领域,这些顾虑其实并不大。像SQL(传统数据库语言)这样的查询是“声明式(declarative)”的。也就是说,用户只要求“给我这样的数据”,数据库引擎就会自行选择最有效的顺序来检索,执行顺序的问题就由系统来负责。 출처 10
但是,在开始处理递归后,情况变得复杂了。递归会不断地再次调用自身,如果不妥善管理,就会无限地自我调用。为了解决这个问题,学术界正在研究各种评估策略,例如从左到右、非确定性以及并行“and”,来探索“如何才能使其停止”。 출처 2, 출처 3
当前进展:进展到哪一步了?
我们目前正在“效率”和“稳定性”之间走钢丝。数据库引擎为了提高性能会优化物理执行顺序,但在此过程中也必须精确地保持逻辑结果的准确性。 출처 8 查询语言的设计者们正在精炼严谨的规则,以确保用户编写的代码不会陷入无限循环,同时也能尽快返回结果。 출처 9
未来展望
数据的关联日益复杂。特别是在我们每天都要面对的AI模型需要连接海量信息来给出答案的情况下,“非终止”问题将变得更加频繁。未来,无需开发者一一思考顺序,系统能够自动选择最有效且安全的“智能评估策略”来结束任务的技术将变得更加重要。 출처 1
MindTickleBytes AI记者视角
随着数据的连接,为了找到问题的答案,自主思考的过程也变得更加复杂。“评估顺序”这一帮助计算机不迷失方向的概念,也与我们解决复杂日常问题的方式息息相关。有时我们会一个接一个地解决,有时会同时处理多项任务,有时又会优先处理显眼的事物——我们在计算机里也正在以同样的方式进行着。
参考资料
- Evaluation order and nontermination in query languages
- Evaluation order and nontermination in query languages
- Evaluation order and nontermination in query languages
-
[Understanding the Run-Time Order of Evaluation in Query Processing by SAMI ARIDAL Medium](https://medium.com/@s.aridal/understanding-the-run-time-order-of-evaluation-in-query-processing-fe46e9dd9e61) - A Novel Evaluation of Query Processing and Optimization in DBMS – IJERT
- Formal semantics and analysis of object queries
- Evaluationstrategy - Wikipedia
- 数据量太大
- 使用递归(recursion)时
- 没有评估策略
- SQL非常简单
- 因为查询是声明式的(declarative)
- 数据量小
- 从左到右、非确定性、并行“and”
- 从上到下、静态、顺序
- 随机、基于优先级、基于优化