什么是查询优化?

查询优化,释义

查询优化是数据库确定最优查询执行方式的过程。

 

当用户提交查询请求时,请求内容通常以结构化查询语言 (SQL) 语句编写,数据库会评估多种数据检索方案。该决策过程由查询优化器组件负责,以此选出效率最高的执行方案。

现代数据库管理系统 (DBMS) 采用基于成本的优化器,先估算各类执行方案的成本,再选定最优方案。受该机制影响,两条结果一致的数据库查询,执行时长可能相差悬殊,时长通常以毫秒计算,进而影响查询性能与响应速度。

查询优化的意义

查询优化,即 SQL 查询优化,其作用并不局限于提升单次查询性能。它通过优化系统扩容与资源使用方式,决定整套数据系统、机器学习模型以及人工智能 (AI) 相关工作的运行效率。

可扩展性

应用程序依靠数据库稳定、快速地检索信息。当查询效率低下时,数据库会耗费多余时间执行表扫描、记录排序以及大型数据集关联等操作。这类延迟会拖慢应用程序编程接口 (API) 与分析工作负载的运行速度,形成性能瓶颈,降低整体使用体验

随着组织采集的数据不断增多,数据体量庞大、数据类型繁杂、查询模式复杂,数据库需要承载的工作负载也持续升级。

预计到 2028 年,全球数据总量将达到 393.9 泽字节,以往仅处理数千行数据的查询,未来可能需要处理数百万甚至数十亿行数据。即使数据量与工作负载复杂度不断提升,查询优化也能保障查询高效执行,提升系统可扩展性。

资源使用

高效的执行方案还能减少查询处理过程中消耗的系统资源。所有数据库操作都需要占用系统资源完成数据处理,包括中央处理单元 (CPU) 运算与磁盘输入/输出 (I/O)。

优化效果不佳的查询会大量消耗资源,完成相同结果所需的运算量远超正常水平。在环境中,资源消耗量直接关联使用成本,资源占用增加会带来更高的开支。

支持机器学习、实时分析检索增强生成 (RAG) 和 AI 的现代数据平台,需要快速且稳定地调取海量数据。查询优化能够保障这类系统快速调取所需信息,支撑实时决策,同时合理控制成本。

AI Academy

数据管理是生成式 AI 的秘诀吗?

深入了解为什么高质量数据对于成功使用生成式 AI 至关重要。

查询优化的关键组件

数据库优化器评估各类执行方案时,可采用多种处理方式。早期数据库系统大多采用基于规则的优化方式,根据查询结构套用预设规则来制定执行方案。

现代 DBMS 通常优先采用基于成本的优化方式,该方式会评估多种可行执行策略并估算各项策略所需资源。部分系统还会结合启发式技术,依托实用规范简化查询规划流程,降低优化开销。

无论采用何种优化方式,优化器对候选执行策略的评估逻辑都依托以下多项技术概念:

  • 查询优化器
  • 数据库统计信息
  • 基数估计
  • 索引和访问路径
  • 连接算法

查询优化器

查询优化器是数据库中负责选定高效执行计划的组件,该组件一般采用基于成本的优化技术。在关系数据库中,该过程可帮助数据库引擎确定执行 SQL 查询的最优方式。

基于成本的优化器不再依赖固定规则,而是分析数据特征与查询结构,以此选定最优执行方式。这种灵活性让数据库可以根据数据集与工作负载的变化调整执行策略。

数据库统计信息

优化器高度依赖数据库统计信息,以此预估各类执行计划的资源消耗。统计信息记录了存储数据的核心特征,包括:

  • 每个表的数据行数
  • 列内数值的分布情况
  • 索引列的选择度
  • 表与表之间的关联关系
  • 各列的数据类型

借助这些统计信息,优化器可以估算查询的返回行数以及不同执行策略的工作量。一旦统计信息出现滞后或偏差,优化器就有可能选出低效的执行计划。

基数估计

基数估计指预判查询每一个执行步骤所能产出的数据行数。例如,查询通过 WHERE 子句筛选数据,示例如下:

WHERE 地区 = '北美'

优化器需要估算符合该筛选条件的记录数量。

这类估算结果会影响多项核心判断。优化器会结合估算结果确定表的连接顺序、最优连接次序、选用的连接算法,以及判断采用索引扫描还是全表扫描。

索引和访问路径

相比全表扫描,索引能够帮助数据库更高效地定位目标数据。优化器会借助索引减少数据检索的工作量。

常见的访问路径包含全表扫描、索引扫描、索引查找与仅索引扫描。全表扫描会读取表内所有行数据,索引扫描依托索引结构读取行数据,索引查找通过索引检索目标行数据,仅索引扫描直接从索引获取数据,无需访问底层数据表。

选用合适的访问路径能够大幅降低查询执行的工作量,处理大型数据表时效果尤为明显。

连接算法

不少查询需要从多个数据表中提取数据。遇到这类场景时,优化器需要确定数据表的组合方式。常见的连接算法包括:

  • 嵌套循环连接:按顺序比对两个数据集内的行数据。当其中一个数据表体量较小,或是索引能够为内连接提供快速检索能力时,该方式可以稳定运行。

  • 哈希连接:基于一个数据集构建哈希表,利用哈希表快速匹配另一个数据集的行数据。此战略通常适用于大型数据集。

  • 合并连接:同步扫描两个已排序数据集,完成行数据合并。

优化器会结合数据体量、可用索引、预估行数等条件,选择对应的连接算法。

查询优化的工作原理

想要理解查询优化的运行原理,可以将 SQL 视作声明式语言,该语言用于定义需要检索的数据内容,而非指定数据检索方式

优化器负责选定执行查询请求的方式保证执行效率最优。为实现这一目标,多数数据库会依次执行多项优化步骤:

  • 解析和验证
  • 重写查询
  • 生成执行计划
  • 估算计划成本
  • 选择执行计划

解析和验证

提交查询后,数据库首先解析 SQL 语句并验证语法。在该阶段中,系统会确认查询引用的数据表、列、索引均已存在,同时校验查询结构合规。

系统还会核验数据库模式内的相关对象处于可用状态。该步骤可以确保数据库在开展优化与执行操作前,完整理解查询请求。

查询改写

解析完成后,数据库可能会将查询转换为语义一致但执行效率更高的形式。这类转换操作不会改变查询结果,同时优化执行结构。常用的查询改写技术包括:

  • 谓词推下,在查询执行前期启用筛选条件,减少后续环节需要处理的数据行数。

  • 子查询平坦化,将嵌套查询转换为连接查询,提升整体执行效率。

  • 连接重新排序,调整数据表的组合顺序,减少中间结果数据。

  • 删除冗余操作,例如多余的排序与去重操作。

这类转换操作可以让优化器尝试更高效的执行策略,且不会改动最终查询结果。同时也能够减少无效数据的处理流程。

生成执行计划

查询被转换后,优化器会生成多套候选执行计划。每套计划对应一种不同的数据检索策略。

各计划的差异体现在索引选用、表连接次序以及中间结果处理方式上。即便是结构简单的查询,也能生成多种可行执行策略。

举例而言,检索近一周订单的单一查询存在多种执行方式,包括扫描订单表后筛选数据、依托订单日期索引快速定位近期记录,或是先缩小数据集范围再关联客户、产品等相关数据表。

估算计划成本

随后优化器会借助成本模型评估每一套候选计划。成本模型用于估算数据库执行指定计划所需的工作量。这些估算通常会考虑以下因素:

  • CPU 处理需求
  • 检索数据所需的磁盘 I/O 操作
  • 排序或散列等操作的内存占用量
  • 分布式环境中的网络传输量

由于数据库无法提前获知确切成本,因此会依托已存储的数据统计信息。这些信息可帮助优化器预估大致处理时长,并选定适配的算法与配套数据结构。

选择执行计划

优化器评估各项候选计划后,会挑选估算成本最低的方案。该选定方案即为查询执行计划,明确数据库运行查询时的操作顺序。

高效的执行计划一般包含表扫描、连接、排序、聚合等操作(例如使用 GROUP BY 或 LEFT JOIN)。用户可以查看 EXPLAIN 计划,了解优化器检索目标数据的具体步骤。

查询优化面临的挑战

尽管现代数据库优化器的功能已十分完善,但仍有多项因素会增加查询优化的难度。

  • 统计数据不准确:统计信息出现滞后或缺失时,优化器会对数据分布做出错误判断。这进而生成低效的执行计划,产生多余的运算开销。
  • 数据倾斜:数据分布不均会导致优化器难以预估查询的返回行数。当部分数值出现频率远高于其他数值时,常规估算方式会出现结果偏差。
  • 复杂查询:包含大量连接、嵌套操作或子查询的查询,会生成海量候选执行计划。逐一评估所有计划并不现实,优化器只能借助启发式规则与近似估算完成判断。这也是系统规模扩大后,SQL 查询优化难度随之提升的原因之一。
  • 动态数据环境:当数据频繁变动时,查询的运行表现也会随之改变。随着数据分布发生变化,原本高效的执行计划也会逐步失效。

常见查询优化技术

查询优化由系统自动完成,但开发人员、管理员和数据工程师可借助多种优化手段提升运行性能。

设计合理的索引

索引若能匹配常用筛选条件与连接条件,可大幅提升查询性能。设计合理的索引可让优化器快速定位目标行数据,无需执行全表扫描。但索引数量过多,会增加数据更新阶段的开销。因此,需要合理规划索引,兼顾数据读取性能与写入效率。

维护数据库统计信息

优化器依靠统计信息估算查询成本,保证统计信息及时更新,是维持执行计划高效运行的关键。定期更新统计信息,可让优化器掌握准确的数据分布与数据表体量信息。

提前筛选数据

在查询执行前期启用筛选条件,能够减少后续环节需要处理的数据行数。缩减中间结果的数据量,有助于加快查询执行速度。因此,尽早使用高选择性筛选条件的查询,运行效率通常更高。

减少冗余连接

关联多个数据表的查询,本身结构复杂,对应的执行计划也会更为繁琐。剔除不必要的连接操作,能够大幅降低执行复杂度。部分场景下,反规范化设计可减少连接操作,从而提升性能,但会增加存储空间占用与数据冗余。

仅选取必要字段

查询读取无用字段,会增加数据读取与处理的总量。将结果集限制为仅包含必填字段,可减少内存占用与磁盘 I/O 操作。这种简单调整能够明显提升大数据集场景下的运行性能。

分区或缓存

在部分使用环境中,分区可将超大表拆分为更易管理的片段,缓存则能针对高频访问结果,减少重复的数据处理操作。这类方式并非通用解决方案,但可与其他优化手段配合使用。

许多数据库平台都配备内置工具,帮助开发人员和管理员分析查询性能,识别低效的执行计划。

例如,SQL Server 管理工作室 (SSMS) 可监控查询性能并定位瓶颈;MySQL Workbench 提供查询计划分析与执行优化相关工具;Oracle SQL Tuning Advisor 可自动给出 SQL 查询优化建议。

查询优化与查询调优

查询优化与查询调整联系紧密,但属于两类不同流程。

查询优化是指数据库自动制定高效执行策略的流程。

相比之下,查询调整则是依靠人工操作优化查询性能。具体操作包含改写低效查询、新建索引、更新统计信息以及调整数据库配置参数等。

在实际应用中,查询优化与查询调整通常配合开展,共同提升数据库性能。二者结合可形成一套实用优化方案,提升线上系统的 SQL 运行性能。

查询优化的发展趋势

查询优化技术已逐步突破传统基于成本的规划模式。现代数据库系统融合了自动化、自适应执行以及 AI 技术,以优化查询的分析与执行流程。

自主数据库功能是当下的新兴发展方向,系统可持续监控运行状态并自动处理各类问题。这类系统不再单纯依靠被动排查问题,而是分析工作负载状态、查询性能与系统指标,提前识别潜在性能风险并给出优化建议。

许多自主数据库架构将相关功能划分为三大运行模块,模块通常由 AI 智能体提供支撑。

  • 智能代理维护功能可自动执行日常操作任务,例如补丁更新、运行状况检查和性能优化。

  • 智能代理自愈功能持续分析系统运行状态,在异常情况影响用户前,识别查询性能退化、锁问题或工作负载瓶颈等问题。

  • 智能代理响应功能会分析系统变动并输出可指导问题修复的洞察分析,帮助团队更快处理故障。

这类智能代理功能基于人机协同模式运行,自动化流程处理标准化操作任务,数据库团队则负责监管核心系统。

随着组织持续扩容数据平台并使用 AI 驱动的应用程序,具备自主监控、优化与维护能力的系统,将为保障数据库稳定运行发挥愈发重要的作用。

作者

Tom Krantz

Staff Writer

IBM Think

Alexandra Jonker

Staff Editor

IBM Think

相关解决方案
IBM® watsonx.data

watsonx.data 支持您通过开放、混合和已治理数据,利用您的所有数据(无论位于何处)扩展分析和 AI。

了解 watsonx.data
数据库解决方案

在任意云上使用数据库运行您的应用程序、分析和生成式 AI。

探索数据库解决方案
数据和 AI 咨询服务

通过制定适当的战略、数据、安全和治理措施,成功实现 AI 的规模化应用。

深入了解数据和 AI 咨询服务
采取后续步骤

借助 IBM watsonx.data 统一所有数据,以用于 AI 和分析。利用混合、开放的湖仓一体,无论数据位于何处,都能为 AI 和分析所用。

  1. 了解 watsonx.data
  2. 深入了解数据管理解决方案