image.png

    1. SQL 文本 (kgscComputeHash) 生成哈希值。
    2. 检查会话端游标缓存(session_cached_cursorskgscFindCursor)。
    3. 通过哈希桶查找parent handle;创建句柄。
    4. KGL parent handle
    5. KGL pin parent handle,创建堆 0,取消固定。
    6. 在子列表中搜索兼容子项(堆 0 中的列表,当前不存在子项)。
    7. 创建一个$BUILD$.last 16 个字符的SQL 文本哈希值独立对象。
    8. 创建child handleKGL 锁定child handle
    9. 获得一个CU 入队(ksqgelctx)。
    10. KGL pin child handle,创建堆 0
    11. 创建SQL AREA STATS 独立对象。
    12. 解开child handle
    13. 子游标初始化(kksParseChildCursor)。
    14. 创建/分配堆 6 (qksshBeginCompile)。
    15. 语法检查(prscmd)。
    16. 语义检查(opiSem)。
    17. 验证所有依赖对象,添加到依赖表。
    18. 验证授权。
    19. 开始创建子游标执行信息(堆 6)。
    20. 访问路径分析(apadrv)。
    21. 创建 OPTIMIZER DIRECTIVE OWNER 独立对象。
    22. 成本核算。
    23. 创建查询结构(在堆 6 中;qkadrvqkadrv2)。
    24. 执行计划生成。
    25. 执行计划注释。
    26. 审计(不确定审计什么以及信息写在哪里;audpre)。
    27. 结束代码生成(kksEndOfCompile)。
    28. 所有 KGL 锁定和 KGL 固定对象(光标和依赖项)都已取消固定并且
    29. 解锁(kksPopCompileCall)。
    30. CU 队列被释放(ksqdel)。
    31. 子游标被添加到父堆 0 中的子列表中。
    32. SQL 文本哈希值独立对象的 $BUILD$.last 16 个字符是
    33. 解锁。

    参考文章:
    parse_in_oracle.pdf