慢查询不仅仅是性能的隐患,也会严重影响用户满意度及业务运营效率。为了优化这些查询,OceanBase 数据库为大家提供了一系列解决慢查询的最佳实践,帮助数据库顺畅运行。
本文深入探讨了多种优化策略,包括绑定执行计划、优化索引、重写 SQL 语句等,旨在显著提高 SQL 性能。
其中,借助系统强大的并行执行能力和高效的分区功能,用户可以在大规模查询场景中大胆应对慢查询。此外,绑定执行计划与灵活的多表连接优化等技术手段,也为用户提供了更精准的性能提升方案。通过一系列无感知的优化,用户可以轻松提升查询性能。此外,文中详细描述了如何利用 Auto DOP 功能,便于用户简化并行度设置的复杂性。
本文适用于 OceanBase 3.x 和 4.x 版本。无论开发者还是数据库管理员,了解并应用这些实践不仅可以帮助大家克服慢查询问题,更能提升数据库的整体性能。
👨🏫 关键概念:
慢查询:执行时间较长的 SQL 查询。
执行计划:数据库为 SQL 语句生成的执行路径。
索引:用于加速数据检索的一种数据库对象。
分区:将数据库表分为多个部分以提高查询效率。
并行执行:同时在多个处理器上运行多个子任务以提高查询效率。
分库分表:将单表数据分散到多个数据库中以提升性能。
连接次序优化:通过调整多表连接顺序来优化 SQL 性能。
OceanBase 是一款原生分布式数据库,具备 HTAP 特性,可在大规模查询场景下保持卓越性能。在 OceanBase 数据库中,可以通过以下四种技术手段,有效解决慢查询问题。
一、通过并行执行
OceanBase 拥有成熟的并行执行能力,可以对普通查询、DDL、DML 操作进行并行执行,并能灵活设置并行度。通过这样的设置,开发者可以通过较少的 CPU 开销大幅提升 SQL 性能。同时,也可以手动或自动设置并行执行。
1、手动设置并行
使用 HINT/*+ parallel(degree) */ 可以为整个 SQL 语句指定统一的并行度。
或者在创建表时,可以使用如下语法,设置表级并行度:
create table big_table(c1 int) parallel = 32;2、自动设置并行度
为了简化在使用 Hint 或建表时设置并行度的过程,OceanBase 数据库在 4.2.1 版本中推出了 Auto DOP 功能。用户可以通过 HINT/*+ parallel(auto) */ 或设置系统变量来启用 Auto DOP。启用后,数据库会根据租户配置和表的数据量自动计算合适的并行度,从而省去手动设置并行度的麻烦,并避免固定并行度可能引发的不合理情况。
用户可以根据实际业务需求调整并行参数 parallel_degree_policy 和 parallel_servers_target,以灵活控制并行度。具体参数说明如下:
📕 parallel_degree_policy:用于控制 Auto DOP 的开关。
📕 parallel_servers_target:表示租户在每个节点上可以申请的并行执行线程数量。
此外,还可以通过以下 SQL 命令开启并设置自动并行度:
-- 开启并行SET GLOBAL parallel_degree_policy = AUTO;-- 设置基表最大扫描时间,单位为 ms,默认为 1000 ms;此处设置基表最大扫描时间为 100 ms,即基表扫描时间超过 100 ms 时,开启并行执行。SET GLOBAL parallel_min_scan_time_threshold = 100;
二、利用 OceanBase 的原生分布式分区功能
OceanBase 数据库作为原生分布式数据库,其分区是独立的存储、高可用、事务单位,表的不同分区可以分布于不同服务器上,利用多机性能加快大表查询速度。同时,OceanBase 的原生分布式能力使应用程序可以像调用单机数据库一样使用,减少业务改造成本。
三、绑定执行计划
对于查询条件过滤性较差的 SQL,可以通过绑定执行计划临时优化性能。然而,如果该 SQL 长期存在性能问题,建议对其逻辑进行修改,以确保长期效果。
1、绑定执行计划
绑定执行计划将特定查询与其最优执行计划固定关联,适用于优化不足的查询。通过将某一具体 SQL 查询和其最优执行计划绑定,数据库在后续执行中直接使用该预设计划,从而降低优化开销,提升性能。
需要注意的是,绑定执行计划并非总是有效。如果数据分布或表结构发生变化,原有的绑定计划可能变得低效甚至导致查询性能下降。因此,建议定期审查绑定的执行计划,并根据需要进行更新或解绑。
📕 上线前:可在 SQL 语句中添加 Hint,控制优化器按照 Hint 指定的行为进行计划生成。
📕 已上线业务:如果优化器选择的计划效果不佳,可以通过绑定计划改善,无需修改 SQL。这可以通过 DDL 操作将一组 Hint 加入到 SQL 中,使优化器生成更优计划,这组 Hint 称为 Outline。
使用 SQL_TEXT 创建 Outline 的语法:
CREATE [OR REPLACE] OUTLINE <outline_name> ON <stmt> [ TO <target_stmt> ];使用 SQL_ID 创建 Outline 的语法:
CREATE OUTLINE outline_name ON sql_id USING HINT hint_text;2、修改 SQL 逻辑
OceanBase 数据库通过一系列优化机制,显著提升查询性能,用户在使用过程中几乎无感知。
🚩 多表连接场景:对于多表连接的场景,OceanBase 实现了一套完备的连接枚举算法,能够灵活基于代价调整连接次序。可以高效处理内连接、外连接、反连接及半连接,甚至允许转换连接类型。
🚩 子查询场景:OceanBase 数据库查询改写模块提供了多种子查询优化策略,针对嵌套层次不深的子查询,能够将其转换为连接,并采取不同的连接算法进行优化。这使得子查询的执行效率得到了显著提升,确保整体查询性能的优化。
🚩 大表聚合场景:大表聚合是一个典型的性能优化场景,OceanBase 具备预聚合优化能力,能够将大表数据拆分成多个组进行聚合处理,再进行最终汇总。结合并行执行,预聚合可以极大地提升执行效率,通常能提高数倍的性能。
四、利用列式存储实现大查询加速,优化即时分析
在业务中,尤其是涉及海量数据的复杂查询场景中,即席查询(Ad hoc 查询)是一个典型的性能挑战。举一个常见的例子:
电子商务公司的后台运营人员在数据后台通过条件筛选(如客户名、下单时间、商品名等)生成动态 SQL 并下发到数据库。
这些查询的特点是筛选条件不确定,无法有效利用传统的索引,往往导致全表扫描。
在数据量较小时,传统数据库如 MySQL 还能勉强应对,但随着数据量增加,这类全表扫描的查询往往需要几十秒甚至数分钟,严重影响响应速度和用户体验。为了解决这个问题,通常会采用 ETL(抽取、转换、加载)将数据同步到实时数仓,以满足复杂查询的需求。
OceanBase 提供了一种替代解决方案:列式存储。通过列式存储加速查询,OceanBase 可直接在数据库内高效处理大规模分析查询,简化架构并降低成本。以下是其特点和优势:
1、列式存储的特点
🚩 数据按列存储:与传统的行式存储不同,列式存储将同一列的数据物理上排列在一起。
🚩 按需读取列:查询时仅需扫描涉及的列数据,避免全表扫描,显著降低 IO 和内存消耗。
🚩 高压缩比:列式存储通常对相同类型的数据进行高效压缩,进一步减少存储和传输开销。
2、列式存储的优势
🚩 查询效率大幅提升:在分析场景中,查询只需扫描相关列,而不必加载整行数据。例如,即席查询通常只需读取部分列,通过列式存储可以快速过滤和聚合数据,响应时间大幅缩短。
🚩 架构简化:OceanBase 支持同时处理 TP(事务处理)和 AP(分析处理)负载,无需额外的 ETL 和外部数仓。相比传统的 MySQL + 实时数仓架构,OceanBase 将所有功能整合于一体,简化了系统部署和运维。
🚩 成本优化:通过减少中间环节(如 ETL 和外部存储),OceanBase 帮助企业节省硬件和软件成本,通常可降低整体成本约 30%。
3、如何启用列式存储
在 OceanBase 数据库中,可以通过以下步骤启用列式存储:
1️⃣ 创建列式存储表:在建表时指定存储格式为列式:
CREATE TABLE orders (order_id BIGINT,customer_name VARCHAR(100),product_name VARCHAR(100),order_time TIMESTAMP,amount DECIMAL(10,2)) WITH COLUMN GROUP (each column);
2️⃣ 查询优化: OceanBase 的优化器会自动选择适合的存储和执行方式,无需额外调整即可获得性能收益。
3️⃣ 监控和调整:使用 OceanBase 的监控工具分析查询性能,并根据需求调整表设计或存储策略。
通过列式存储,OceanBase 实现了高效的数据筛选与聚合,无需外部数仓即可处理复杂的即席查询,极大地简化了数据架构并提升查询性能。这种方法尤其适用于需要快速响应的大数据查询场景,为企业提供了经济高效的解决方案。
五、实践总结
OceanBase 的原生分布式架构和 HTAP 能力使其在大规模查询场景中表现出色,能够有效处理复杂的即席查询和大数据分析任务。通过合理配置并行度、利用分区功能、优化多表连接和子查询,用户可以在不改变业务逻辑的情况下,轻松提升查询效率。此外,列式存储的引入进一步简化了数据架构,降低了成本,同时大幅提升了查询性能。
OceanBase 数据库通过一系列无感知的优化手段,帮助用户轻松应对慢查询问题,确保数据库的高效运行。无论是面对高并发的在线事务处理,还是复杂的数据分析任务,OceanBase 都能提供稳定、高效的解决方案。如需了解更多关于 OceanBase 性能调优的详细信息,请参考以下文档:
OceanBase 性能调优的技术架构:
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001049896

OceanBase 性能调优的使用方法:
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001050803

希望本文的实践总结能为您的数据库优化工作提供有价值的参考。




