
从 SQL 文本 (kgscComputeHash) 生成哈希值。• 检查会话端游标缓存(session_cached_cursors;kgscFindCursor)。• 通过哈希桶查找parent handle;创建句柄。• KGL 锁 parent handle。• KGL pin parent handle,创建堆 0,取消固定。• 在子列表中搜索兼容子项(堆 0 中的列表,当前不存在子项)。• 创建一个$BUILD$.last 16 个字符的SQL 文本哈希值独立对象。• 创建child handle,KGL 锁定child handle。• 获得一个CU 入队(ksqgelctx)。• KGL pin child handle,创建堆 0。• 创建SQL AREA STATS 独立对象。• 解开child handle。• 子游标初始化(kksParseChildCursor)。• 创建/分配堆 6 (qksshBeginCompile)。• 语法检查(prscmd)。• 语义检查(opiSem)。• 验证所有依赖对象,添加到依赖表。• 验证授权。• 开始创建子游标执行信息(堆 6)。• 访问路径分析(apadrv)。• 创建 OPTIMIZER DIRECTIVE OWNER 独立对象。• 成本核算。• 创建查询结构(在堆 6 中;qkadrv、qkadrv2)。• 执行计划生成。• 执行计划注释。• 审计(不确定审计什么以及信息写在哪里;audpre)。• 结束代码生成(kksEndOfCompile)。• 所有 KGL 锁定和 KGL 固定对象(光标和依赖项)都已取消固定并且解锁(kksPopCompileCall)。• CU 队列被释放(ksqdel)。• 子游标被添加到父堆 0 中的子列表中。• SQL 文本哈希值独立对象的 $BUILD$.last 16 个字符是解锁。
参考文章:
parse_in_oracle.pdf
