自适应游标共享监视使用绑定变量来确定新计划是否更有效的语句。
假设应用程序执行了以下语句五次,每次都绑定不同的值:
SELECT * FROM employees WHERE salary = :sal AND department_id = :dept在此示例中,还假设在谓词中的至少一列上存在直方图。数据库按以下方式处理此语句:
- 该应用程序第一次发出该语句,这将导致硬解析。在解析期间,数据库执行以下任务:
- 窥视绑定变量以生成初始计划。
- 将游标标记为对绑定敏感。绑定敏感的游标是游标其最佳计划可以取决于绑定变量的值。为了确定不同的计划是否有益,数据库将监视使用不同绑定值的绑定敏感游标的行为。
- 存储有关谓语的元数据,包括绑定值的基数(在此示例中,假定仅返回5行)。
- 根据偷看的值创建执行计划(在本示例中为索引访问)。
- 数据库执行游标,将绑定值和执行统计信息存储在游标中。
- 应用程序使用不同的绑定变量再次发出该语句,从而使数据库执行软解析,并在库高速缓存中找到匹配的游标。
- 数据库执行游标。
- 该数据库执行后任务:
- 数据库将第二次执行的执行统计信息与第一次执行的统计信息进行比较。
- 数据库观察所有先前执行的统计信息模式,然后决定是否将游标标记为可识别绑定的游标。在此示例中,假定数据库确定游标是绑定感知的。
- 应用程序使用不同的绑定变量第三次发出该语句,从而导致软解析。因为游标是可识别绑定的,所以数据库执行以下操作:
- 确定新值的基数是否与存储的基数在同一范围内。在此示例中,基数相似:8行而不是5行。
- 在现有子游标中重用执行计划。
- 数据库执行游标。
- 应用程序使用不同的绑定变量第四次发出该语句,从而导致软解析。因为游标是可识别绑定的,所以数据库执行以下操作:
- 确定新值的基数是否与存储的基数在同一范围内。在此示例中,基数有很大不同:102行(在具有107行的表中)而不是5行。
- 找不到匹配的子光标。
- 数据库执行硬解析。结果,数据库执行以下操作:
- 创建具有第二个执行计划的新子游标(在此示例中,为全表扫描)
- 在游标中存储有关谓词的元数据,包括绑定值的基数
- 数据库执行新的游标。
- 数据库将新的绑定值和执行统计信息存储在新的子游标中。
- 应用程序使用不同的绑定变量第五次发出该语句,这将导致软解析。因为游标是可识别绑定的,所以数据库执行以下操作:
- 确定新值的基数是否与存储的基数在同一范围内。在此示例中,基数为20。
- 找不到匹配的子光标。
- 数据库执行硬解析。结果,数据库执行以下操作:
- 创建具有第三个执行计划的新子游标(在本示例中为索引访问)
- 确定此索引访问执行计划与用于第一次执行该语句的索引访问执行计划相同
- 合并包含索引访问计划的两个子游标,这涉及将合并的基数统计信息存储到一个子游标中,并删除另一个子游标
- 数据库使用索引访问执行计划执行游标。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




