首页
学习
活动
专区
工具
TVP
发布

SQL性能第1篇:关系优化

女主宣言

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

PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!

应用程序开发人员必须编写高效的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性能优化方面有所帮助。

HULK一线技术杂谈

由360云平台团队打造的技术分享公众号,内容涉及云计算、数据库、大数据、监控、泛前端、自动化测试等众多技术领域,通过夯实的技术积累和丰富的一线实战经验,为你带来最有料的技术分享

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181204B1C7UA00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券