当我们触发像
这样的SQL查询时SELECT *来自ORACLE下的SOME_TABLE_NAME
内部究竟发生了什么?工作中有解析器吗?它是用C / C ++吗?
任何人都可以解释一下吗?
提前感谢所有人。
答案 0 :(得分:4)
简短回答是肯定的,当然Oracle内部有一个解析器模块来解释语句文本。我的理解是Oracle的大部分源代码都在C语言中。
供一般参考:
当要求Oracle执行它时,任何SQL语句都可能经历三个步骤。通常,在每个步骤之间将控制权返回给客户端,尽管细节可能取决于所使用的特定客户端以及进行调用的方式。
(1)解析 - 我认为第一个操作实际上是检查Oracle是否有精确语句文本的缓存副本。如果是这样,它可以节省再次解析语句的工作。如果没有,它当然必须解析文本,然后确定Oracle认为对于该语句最佳的执行计划。所以从概念上讲,至少在这个阶段有两个实体在工作 - 解析器和优化器。
(2)执行 - 对于SELECT语句,此步骤通常会运行足够的执行计划,以准备将某些行返回给客户端。根据计划的细节,这可能意味着运行整个事情,或者可能意味着只完成一小部分工作。对于任何其他类型的陈述,执行阶段是指所有工作都已完成。
(3)Fetch - 这是实际将行返回给客户端的时间。通常,客户端具有预定的提取数组大小,该大小设置单个提取调用将返回的最大行数。因此,对于单个语句可能会有许多提取。当然,如果该语句是不能返回行的语句,则不需要获取提取步骤。
答案 1 :(得分:-1)
玛纳斯,
我认为内部Oracle会有自己的解析器,它会解析并尝试编译查询。认为它与C或C ++无关。
但需要确认。
-Justin Samuel。