抖音技术能力大揭密!钜惠大礼、深度体验,尽在火山引擎增长沙龙,就等你来! 立即报名>> 了解详情
写点什么

SQL 性能第 1 篇:关系优化

2019 年 11 月 20 日

SQL性能第1篇:关系优化

本文旨在让大家了解关系优化的相关内容,包括它的需求和需要考虑的重要问题。在下一部分中,我们将研究查询分析和优化器可以部署的一些方法,以制定 SQL 访问路径。希望对大家在 SQL 性能优化方面有所帮助。


应用程序开发人员必须编写高效的 SQL 代码,并了解如何优化 SQL 以开发高效的应用程序。但不仅仅是程序员,DBA 也必须理解 SQL 优化。这是一个共同的责任,通常需要健壮的工具来帮助有效地编码、修改和优化 SQL。


关系优化器是 DBMS 的核心。它是一个推理引擎,负责为任何给定的 SQL 请求确定最佳的数据库导航策略。开发人员通过编码 SQL 语句指定需要哪些数据,DBMS 访问关于数据所在位置的元数据,关系优化器决定如何有效地导航数据库。终端用户不需要知道实际数据存储在哪里以及如何存储。优化器知道这些信息。


为了优化 SQL,关系优化器必须通过解析每个 SQL 语句来分析它,以确定必须访问的表和列。优化器还将访问存储在系统目录或数据库对象本身中的统计信息。统计信息用于确定完成满足 SQL 请求所需执行的任务的最佳方法。这个过程称为关系优化。


关系优化非常强大,因为它允许查询适应不断变化的数据库环境。优化器可以通过制定新的访问路径来响应更改,而不需要实现应用程序编码更改。因此,当表在大小上展开或收缩、索引被添加或删除、数据库变得无序或重新组织时,应用程序可以是灵活的。


无论数据是如何物理存储和操作的,都可以使用 SQL 来访问数据,DBMS 将考虑数据库的当前状态来优化数据访问。这种访问标准与物理存储特征的分离称为物理数据独立性。


每个关系数据库系统都依赖优化器将 SQL 语句呈现为可执行访问路径。此外,每个供应商的关系优化器的工作方式略有不同,使用不同的步骤和不同的信息。然而,从数据库管理系统到数据库管理系统的过程是相同的。优化器解析 SQL 语句并执行各种阶段的优化,通常包括验证语法和语义的正确性,然后是查询分析和制定满足查询的访问路径。


关系优化器可以部署许多类型的策略来优化 SQL 语句。每个 DBMS 优化器使用的内部操作和指令都是严格保守的秘密。现代关系优化器是基于成本的,这意味着优化器将尝试为每个查询制定降低总体成本的访问路径。要以这种方式工作,优化器必须评估和分析多个因素,包括估计的 CPU 和 I/O 成本、数据库统计信息和实际的 SQL 语句。


1 CPU 和 I/O 成本

优化器使用公式和模型来估计运行正在优化的查询的每个潜在访问路径的机器成本。基于 CPU 信息,优化器可以粗略估计使用它分析的每个优化访问路径运行查询所需的 CPU 时间。


此外,关系优化器必须估算实际写入和检索数据的成本。优化器根据数据库统计数据、数据缓存效率和中间工作文件的 I/O 成本,使用一系列公式估算查询的 I/O 成本。这些公式会产生一个筛选因子,它决定查询的相对 I/O 成本。


2 数据库统计

如果没有关于存储在数据库中的数据的准确统计,关系优化器几乎没有用处。关系型 DBMS 提供了一个实用程序或命令来收集关于数据库对象的统计信息,并存储它们以供优化器(或 DBA 用于性能监视)使用。例如,要在 DB2 中收集统计信息,DBA 必须执行 RUNSTATS 实用程序;要在 SQL Server 中收集统计信息,发出 UPDATE STATISTICS 命令。


每当添加或修改了大量数据时,都需要收集修改后的统计信息。如果做不到这一点,将导致优化器基于不准确的统计数据估算成本。这可能不利于查询性能。


数据库统计信息向优化器提供关于表空间、表、列和索引的状态的信息。数据库管理系统收集统计信息,如:


  • 表空间、表或索引中的行数

  • 存储在列中的惟一值的数目

  • 列最常见的值

  • 索引键密度,或存储在索引键列中的重复值的平均百分比

  • 有关群集表的群集比率的详细信息

  • 列与其他列的相关性

  • 索引或表空间的结构状态

  • 数据库对象使用的存储量


并非每次请求新的统计数据时都会收集所有统计数据;您可以指定要收集哪种类型的数据库统计信息。当然,收集到的准确统计数据因数据库管理系统的不同而不同;您的数据库系统中可能有更多或更少的统计信息。但是,关键是保持统计数据尽可能准确,以确保有效和有用的关系优化。


在针对测试数据库开发应用程序时,测试数据的统计信息不能准确反映生产数据库的统计信息。只要可能,DBA 应该与应用程序开发团队一起创建一个脚本,将生产统计信息填充到测试系统中。根据 DBMS 的不同,这可以通过 SQL 语句或数据测试工具来完成。如果没有生产统计信息,DBMS 可能会在测试环境中选择不同的访问路径,而不是在生产环境中选择的访问路径——这可能会导致性能问题。


总结

在本篇中,我们介绍了关系优化的主题,包括它的需求和需要考虑的重要问题。在下一部分中,我们将研究查询分析和优化器可以部署的一些方法,以制定 SQL 访问路径。希望对大家在 SQL 性能优化方面有所帮助。


本文转载自公众号 360 云计算(ID:hulktalk)。


原文链接:


https://mp.weixin.qq.com/s/y6sLM0SIEZpoBn-zFlnB2A


2019 年 11 月 20 日 00:00329

评论

发布
暂无评论
发现更多内容

第八周总结

Geek_ac4080

架构师训练营第八周命题作业

一马行千里

极客大学架构师训练营 命题作业

架构师训练营第八周学习笔记

一马行千里

学习 极客大学架构师训练营

架构师week08总结

FG佳

第八周作业

Geek_ac4080

性能优化-文件硬盘I/O,数据结构算法,网络通讯

garlic

极客大学架构师训练营

架构师训练营第 1 期 -Week8 - 性能优化二学习总结

鲁小鲁

极客大学架构师训练营

第八 周 性能优化(二)作业

钟杰

极客大学架构师训练营

架构一期 第八周作业

haha

架构师一期

第八周作业

fmouse

极客大学架构师训练营

第八周作业及总结

solike

判断两个单向链表是否合并

Jacky.Chen

架构师1期week08作业

FG佳

架构师一期

极客时间架构 1 期:第8周 性能优化(二) - 命题作业

Null

一个典型的大型互联网应用系统使用的技术方案

落朽

架构师训练营 1 期第 8 周:性能优化(二)- 总结

piercebn

极客大学架构师训练营

架构师训练营第 1 期 -Week8 - 课后练习

鲁小鲁

极客大学架构师训练营

【架构师训练营第 1 期 08 周】 学习总结

Bear

极客大学架构师训练营

架构师训练营 第四周 作业

xiaomao

第八周学习总结

熊桂平

极客大学架构师训练营

架构师训练营第 1 期 - 第 8 周 - 学习总结

wgl

已经 2020 年了,真的要继续 RoR 么?

escray

面经 面试经历 101次面试

性能优化(二)

wing

极客大学架构师训练营

架構師訓練營第 1 期 - 第 08 周總結

Panda

架構師訓練營第 1 期

极客时间架构 1 期:第8周 性能优化(二) - 学习总结

Null

第 4 周 系统架构作业

心在那片海

算法:链表是否重合查询

博古通今小虾米

架构师训练营 - 作业 - 第八周

Max2012

第 4 周 系统架构总结

心在那片海

架构师训练营 2 期 - 第 4 周命题作业

Geek_no_one

极客大学架构师训练营

架构师训练营第八周作业

文智

极客大学架构师训练营

Study Go: From Zero to Hero

Study Go: From Zero to Hero

SQL性能第1篇:关系优化-InfoQ