OBCP第三章 SQL引擎技术-执行计划缓存

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: OBCP第三章 SQL引擎技术-执行计划缓存

一次完整的语法解析、语义分析、查询改写、查询优化、代码生成的SQL编译流程称为一次“硬解析”,硬解析生成执行计划的过程比较耗时(一般为毫秒级),这对于OLTP语句来说是很难接受的

OceanBase通过计划缓存(Plan Cache)来避免SQL硬解析


执行计划缓存的淘汰-自动淘汰条件及策略

自动淘汰是指当计划缓存占用的内存达到了需要淘汰计划的内存上限(即淘汰计划的高水位线)时,对计划缓存中的计划执行自动淘汰。

触发执行计划淘汰的条件

每隔一段时间(具体时间间隔由配置项 plan_cache_evict_interval 设置)系统会自动检查不同租户在不同服务 器上的计划缓存,并判断是否需要执行计划淘汰。如果某个计划缓存占用的内存超过该租户设置的淘汰计划的高 水位线,则会触发计划缓存淘汰。

执行计划淘汰策略

当触发计划缓存淘汰后,优先淘汰最久没被使用的执行计划,淘汰一部分执行计划后,当计划缓存使用的内存为该租户设置的淘汰计划的低水位线时,停止淘汰

执行计划缓存的淘汰-自动淘汰相关配置

当计划缓存占用的内存达到了需要淘汰计划的内存上限(即淘汰计划的高水位线)时,对计划缓存中的执行计划自动进行淘汰


优先淘汰最久没被使用的执行计划,影响淘汰策略的参数和变量如下:

1.plan_cache_evict_interval(parameter):检查执行计划是否需要淘汰的间隔时间

2.ob_plan_cache_percentage(variable):计划缓存可使用内存占租户内存的百分比 (最多可使用内存为:租户内存上限 * ob_plan_cache_percentage/100)

3.ob_plan_cache_evict_high_percentage (variable) :计划缓存使用率(百分比)达到多少时,触发计划缓存的淘汰

4.ob_plan_cache_evict_low_percentage (variable) :计划缓存使用率(百分比)达到多少时,停止计划缓存的淘汰

执行计划缓存的淘汰-自动淘汰示例

如果租户内存大小为10G,并且变量设置如下:

ob_plan_cache_percentage = 10;

ob_plan_cache_evict_high_percentage = 90;

ob_plan_cache_evict_low_percentage = 50;

则:


计划缓存内存上限绝对值 = 10G * 10 / 100 = 1G;

淘汰计划的高水位线 = 1G * 90 / 100 = 0.9G;

淘汰计划的低水位线 = 1G * 50 / 100 = 0.5G;

1.当该租户在某个server上计划缓存使用超过0.9G时,会触发淘汰,优先淘汰最久没执行的计划

2.当淘汰到使用内存只有0.5G时,则停止淘汰

3.如果淘汰速度没有新计划生成速度快,计划缓存使用内存达到内存上限绝对值1G时,将不再往计划缓存中添加新计划,直到淘汰后使用的内存小于1G才会添加新计划到计划缓存中

执行计划缓存的淘汰-手动淘汰

手动淘汰是指强制将计划缓存中计划进行删除。现在支持指定不同租户对应的当前服务器或全部服务器中计划缓存全部删除,SQL 语句如下:

obclient>ALTER SYSTEM FLUSH PLAN CACHE [tenant_list] [global]

执行计划缓存的刷新

计划缓存中执行计划可能因为各种原因而失效,这时需要将计划缓存中失效计划进行刷新,即将该执行计划删除后重新优化生成计划再加入计划缓存。


如下场景会导致执行计划失效,需要对执行计划进行刷新:


SQL中涉及表的Schema变更时(比如添加索引、删除或增加列等),该SQL在计划缓存中所对应的执行计划将被刷新

SQL中涉及重新收集表的统计信息时,该SQL在计划缓存中所对应的执行计划会被刷新。由于OceanBase数据库在数据合并时会统一进行统计信息的收集,因此在每次进行合并后,计划缓存中所有计划将被刷新

SQL进行outline计划绑定变更时,该SQL对应的执行计划会被刷新,更新为按绑定的outline生成的执行计划

执行计划缓存的使用控制

计划缓存可以使用系统变量及 Hint 实现使用控制。


系统变量控制


当 ob_enable_plan_cache设置为 TURE 时,表示SQL请求可以使用计划缓存;设置为FALSE时,表示 SQL请求不使用计划缓存。默认为TURE。此系统变量可被设置为 Session 级别或者 Global 级别


Hint 控制


使用 Hint 语句 /+USE_PLAN_CACHE(NONE)/ 表示不使用计划缓存

使用 Hint 语句 /+USE_PLAN_CACHE(DEFAULT)/ 表示使用计划缓存

执行计划缓存的相关视图及不支持的场景

计划缓存相关的视图:


1.(g)v$plan_cache_stat记录每个计划缓存的状态,每个计划缓存在该视图中有一条记录。

2. (g)v$plan_cache_plan_stat记录计划缓存中所有执行计划的具体信息及每个计划总的执行统计信息。

3. (g)v$plan_cache_plan_explain记录某条SQL在计划缓存中的执行计划

计划缓存暂不支持的场景

执行计划所占内存超过 20 MB 时,不会加入计划缓存

如果该计划为分布式执行计划且涉及多个表,不会加入计划缓存

相关文章
|
23天前
|
SQL Oracle 关系型数据库
Oracle SQL:了解执行计划和性能调优
Oracle SQL:了解执行计划和性能调优
36 1
|
24天前
|
SQL 安全 数据库
sql注入技术
sql注入技术
|
2月前
|
SQL 机器学习/深度学习 自然语言处理
Text-to-SQL技术演进 - 阿里云OpenSearch-SQL在BIRD榜单夺冠方法剖析
本文主要介绍了阿里云OpenSearch在Text-to-SQL任务中的最新进展和技术细节。
|
2月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
96 0
|
3月前
|
测试技术 Java
揭秘Struts 2测试的秘密:如何打造无懈可击的Web应用?
【8月更文挑战第31天】在软件开发中,确保代码质量的关键在于全面测试。对于基于Struts 2框架的应用,结合单元测试与集成测试是一种有效的策略。单元测试聚焦于独立组件的功能验证,如Action类的执行逻辑;而集成测试则关注组件间的交互,确保框架各部分协同工作。使用JUnit进行单元测试,可通过简单示例验证Action类的返回值;利用Struts 2 Testing插件进行集成测试,则可模拟HTTP请求,确保Action方法正确处理请求并返回预期结果。这种结合测试的方法不仅提高了代码质量和可靠性,还保证了系统各部分按需协作。
17 0
|
3月前
|
SQL 数据挖掘 数据库
SQL中的重复行删除:技术与策略
【8月更文挑战第31天】
78 0
|
3月前
|
SQL 数据管理 关系型数据库
SQL分区表技术的奥秘:如何用分区策略让你的大规模数据飞起来?
【8月更文挑战第31天】在现代软件开发中,处理大规模数据是常见挑战,而SQL分区表技术提供了一种高效的解决方案。本文详细介绍了SQL分区表的概念、类型(范围、列表、哈希和键分区)及其创建与维护方法,并通过示例代码展示了如何添加、删除和重组分区。遵循了解查询模式、定期维护分区及使用数据库性能工具等最佳实践,可以帮助开发者更高效地进行数据管理。随着SQL生态的发展,分区表技术将在未来发挥更大作用。
32 0
|
3月前
|
SQL JSON 关系型数据库
"SQL老司机大揭秘:如何在数据库中玩转数组、映射与JSON,解锁数据处理的无限可能,一场数据与技术的激情碰撞!"
【8月更文挑战第21天】SQL作为数据库语言,其能力不断进化,尤其是在处理复杂数据类型如数组、映射及JSON方面。例如,PostgreSQL自8.2版起支持数组类型,并提供`unnest()`和`array_agg()`等函数用于数组的操作。对于映射类型,虽然SQL标准未直接支持,但通过JSON数据类型间接实现了键值对的存储与查询。如在PostgreSQL中创建含JSONB类型的表,并使用`->>`提取特定字段或`@>`进行复杂条件筛选。掌握这些技巧对于高效管理现代数据至关重要,并预示着SQL在未来数据处理领域将持续扮演核心角色。
51 0
|
3月前
|
SQL 存储 缓存
SQL Server 内存占用较高 - 清除缓存 或 设置内存最大占用值
SQL Server 内存占用较高 - 清除缓存 或 设置内存最大占用值
65 0
|
4月前
|
SQL 数据处理 Apache
Apache Flink SQL:实时计算的核心引擎
Apache Flink SQL 的一些核心功能,并探讨了其在实时计算领域的应用。随着 Flink 社区的不断发展和完善,Flink SQL 将变得越来越强大,为实时数据分析带来更多的可能性。