暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何优化慢查询性能? | OceanBase最佳实践 15

原创 OceanBase数据库 2025-02-21
392

慢查询不仅仅是性能的隐患,也会严重影响用户满意度及业务运营效率。为了优化这些查询,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

图片

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论