通过 Think 时事通讯,了解有关 AI、自动化、数据等方面最重要且最有趣的行业趋势。请参阅 IBM 隐私声明。
数据库优化器评估各类执行方案时,可采用多种处理方式。早期数据库系统大多采用基于规则的优化方式,根据查询结构套用预设规则来制定执行方案。
现代 DBMS 通常优先采用基于成本的优化方式,该方式会评估多种可行执行策略并估算各项策略所需资源。部分系统还会结合启发式技术,依托实用规范简化查询规划流程,降低优化开销。
无论采用何种优化方式,优化器对候选执行策略的评估逻辑都依托以下多项技术概念:
查询优化器是数据库中负责选定高效执行计划的组件,该组件一般采用基于成本的优化技术。在关系数据库中,该过程可帮助数据库引擎确定执行 SQL 查询的最优方式。
基于成本的优化器不再依赖固定规则,而是分析数据特征与查询结构,以此选定最优执行方式。这种灵活性让数据库可以根据数据集与工作负载的变化调整执行策略。
优化器高度依赖数据库统计信息,以此预估各类执行计划的资源消耗。统计信息记录了存储数据的核心特征,包括:
借助这些统计信息,优化器可以估算查询的返回行数以及不同执行策略的工作量。一旦统计信息出现滞后或偏差,优化器就有可能选出低效的执行计划。
基数估计指预判查询每一个执行步骤所能产出的数据行数。例如,查询通过 WHERE 子句筛选数据,示例如下:
WHERE 地区 = '北美'
优化器需要估算符合该筛选条件的记录数量。
这类估算结果会影响多项核心判断。优化器会结合估算结果确定表的连接顺序、最优连接次序、选用的连接算法,以及判断采用索引扫描还是全表扫描。
相比全表扫描,索引能够帮助数据库更高效地定位目标数据。优化器会借助索引减少数据检索的工作量。
常见的访问路径包含全表扫描、索引扫描、索引查找与仅索引扫描。全表扫描会读取表内所有行数据,索引扫描依托索引结构读取行数据,索引查找通过索引检索目标行数据,仅索引扫描直接从索引获取数据,无需访问底层数据表。
选用合适的访问路径能够大幅降低查询执行的工作量,处理大型数据表时效果尤为明显。
不少查询需要从多个数据表中提取数据。遇到这类场景时,优化器需要确定数据表的组合方式。常见的连接算法包括:
优化器会结合数据体量、可用索引、预估行数等条件,选择对应的连接算法。
想要理解查询优化的运行原理,可以将 SQL 视作声明式语言,该语言用于定义需要检索的数据内容,而非指定数据检索方式。
优化器负责选定执行查询请求的方式,并保证执行效率最优。为实现这一目标,多数数据库会依次执行多项优化步骤:
解析完成后,数据库可能会将查询转换为语义一致但执行效率更高的形式。这类转换操作不会改变查询结果,同时优化执行结构。常用的查询改写技术包括:
这类转换操作可以让优化器尝试更高效的执行策略,且不会改动最终查询结果。同时也能够减少无效数据的处理流程。
查询被转换后,优化器会生成多套候选执行计划。每套计划对应一种不同的数据检索策略。
各计划的差异体现在索引选用、表连接次序以及中间结果处理方式上。即便是结构简单的查询,也能生成多种可行执行策略。
举例而言,检索近一周订单的单一查询存在多种执行方式,包括扫描订单表后筛选数据、依托订单日期索引快速定位近期记录,或是先缩小数据集范围再关联客户、产品等相关数据表。
随后优化器会借助成本模型评估每一套候选计划。成本模型用于估算数据库执行指定计划所需的工作量。这些估算通常会考虑以下因素:
由于数据库无法提前获知确切成本,因此会依托已存储的数据统计信息。这些信息可帮助优化器预估大致处理时长,并选定适配的算法与配套数据结构。
优化器评估各项候选计划后,会挑选估算成本最低的方案。该选定方案即为查询执行计划,明确数据库运行查询时的操作顺序。
高效的执行计划一般包含表扫描、连接、排序、聚合等操作(例如使用 GROUP BY 或 LEFT JOIN)。用户可以查看 EXPLAIN 计划,了解优化器检索目标数据的具体步骤。
尽管现代数据库优化器的功能已十分完善,但仍有多项因素会增加查询优化的难度。
查询优化由系统自动完成,但开发人员、管理员和数据工程师可借助多种优化手段提升运行性能。
索引若能匹配常用筛选条件与连接条件,可大幅提升查询性能。设计合理的索引可让优化器快速定位目标行数据,无需执行全表扫描。但索引数量过多,会增加数据更新阶段的开销。因此,需要合理规划索引,兼顾数据读取性能与写入效率。
优化器依靠统计信息估算查询成本,保证统计信息及时更新,是维持执行计划高效运行的关键。定期更新统计信息,可让优化器掌握准确的数据分布与数据表体量信息。
在查询执行前期启用筛选条件,能够减少后续环节需要处理的数据行数。缩减中间结果的数据量,有助于加快查询执行速度。因此,尽早使用高选择性筛选条件的查询,运行效率通常更高。
关联多个数据表的查询,本身结构复杂,对应的执行计划也会更为繁琐。剔除不必要的连接操作,能够大幅降低执行复杂度。部分场景下,反规范化设计可减少连接操作,从而提升性能,但会增加存储空间占用与数据冗余。
查询读取无用字段,会增加数据读取与处理的总量。将结果集限制为仅包含必填字段,可减少内存占用与磁盘 I/O 操作。这种简单调整能够明显提升大数据集场景下的运行性能。
在部分使用环境中,分区可将超大表拆分为更易管理的片段,缓存则能针对高频访问结果,减少重复的数据处理操作。这类方式并非通用解决方案,但可与其他优化手段配合使用。
许多数据库平台都配备内置工具,帮助开发人员和管理员分析查询性能,识别低效的执行计划。
例如,SQL Server 管理工作室 (SSMS) 可监控查询性能并定位瓶颈;MySQL Workbench 提供查询计划分析与执行优化相关工具;Oracle SQL Tuning Advisor 可自动给出 SQL 查询优化建议。
查询优化与查询调整联系紧密,但属于两类不同流程。
查询优化是指数据库自动制定高效执行策略的流程。
相比之下,查询调整则是依靠人工操作优化查询性能。具体操作包含改写低效查询、新建索引、更新统计信息以及调整数据库配置参数等。
在实际应用中,查询优化与查询调整通常配合开展,共同提升数据库性能。二者结合可形成一套实用优化方案,提升线上系统的 SQL 运行性能。
查询优化技术已逐步突破传统基于成本的规划模式。现代数据库系统融合了自动化、自适应执行以及 AI 技术,以优化查询的分析与执行流程。
自主数据库功能是当下的新兴发展方向,系统可持续监控运行状态并自动处理各类问题。这类系统不再单纯依靠被动排查问题,而是分析工作负载状态、查询性能与系统指标,提前识别潜在性能风险并给出优化建议。
许多自主数据库架构将相关功能划分为三大运行模块,模块通常由 AI 智能体提供支撑。
这类智能代理功能基于人机协同模式运行,自动化流程处理标准化操作任务,数据库团队则负责监管核心系统。
随着组织持续扩容数据平台并使用 AI 驱动的应用程序,具备自主监控、优化与维护能力的系统,将为保障数据库稳定运行发挥愈发重要的作用。
watsonx.data 支持您通过开放、混合和已治理数据,利用您的所有数据(无论位于何处)扩展分析和 AI。
在任意云上使用数据库运行您的应用程序、分析和生成式 AI。
通过制定适当的战略、数据、安全和治理措施,成功实现 AI 的规模化应用。