思维导图:
前言:
-
查询优化的重要性:首先强调查询优化在关系数据库系统中的核心作用。可以提到,查询优化技术是关系数据库和非过程化的SQL取得巨大成功的关键因素之一。
-
关系查询优化与系统性能:解释关系查询优化对于关系数据库管理系统性能的重要性。指出优化是如何影响数据库的整体性能,特别是在处理大量和复杂的数据查询时。
-
挑战与机遇:阐述优化对关系系统来说既是挑战也是机遇。挑战在于,为了满足用户对性能的期望,必须对查询进行优化。同时,这也是一个机遇,因为关系系统的高级语义表达使得从关系表达式中分析查询语义成为可能,从而提供了性能优化的空间。
-
性能提升的可能性:最后可以探讨如何通过查询优化使关系系统在性能上接近甚至超过非关系系统。这部分可以包括一些优化策略的例子,比如索引使用、查询重写、执行计划的选择等。
第9.2.1节:查询优化概述
-
查询优化的重要性
- 查询优化是关系数据库管理系统的核心技术。
- 它减少了用户在选择数据存取路径上的负担。
-
用户的角色
- 用户只需要指明需要做什么(即查询的目的),而不是怎么做(即具体的查询执行方式)。
-
与非关系系统的对比
- 在非关系系统中,用户需要使用过程化语言来表达查询,并决定记录级的操作及其顺序。
- 用户需要理解存取路径,且查询效率取决于用户的策略。
- 如果用户选择不当,非关系系统无法自动优化。
-
查询优化的优势
- 用户无需深入考虑如何表达查询以获得高效率。
- 系统优化通常比用户手工优化更高效。
-
优化器的作用
- 优化器利用数据字典中的统计信息(如元组数、属性值分布、索引信息等)选择高效的执行计划。
- 数据库物理统计信息的变化可以引导系统自动重新优化查询。
- 优化器能够考虑比程序员更多的执行计划。
- 包含复杂优化技术,这些技术对一般用户来说较难掌握。
-
代价模型
- 关系数据库通过代价模型计算查询执行策略的代价,选择代价最小的方案。
- 代价包括:I/O代价、CPU代价、内存代价,以及分布式数据库中的通信代价。
- 磁盘I/O操作的时间成本远高于内存操作,因此常用读写块数作为代价的衡量单位。
-
优化目标与实际情况
- 优化目标是降低查询代价,求得给定关系表达式的值。
- 由于搜索空间大,实际系统可能只能选择次优策略。
第9.2.2节:查询优化的实例
-
实例背景
- 目标:求选修了2号课程的学生姓名。
- 数据库情况:1000个学生记录,10000个选课记录,其中50个记录是选修2号课程的。
-
SQL语句
- 使用SQL查询:
SELECT Student.Sname FROM Student, SC WHERE Student.Sno = SC.Sno AND SC.Cno = '2';
- 使用SQL查询:
-
查询优化的必要性
- 系统可以使用多种等价的关系代数表达式来完成这一查询。
- 这个例子展示了不同查询执行策略对查询效率的巨大影响。
-
三种查询执行策略
- 策略一:广义笛卡尔积,然后选择和投影操作。读写数据块总数为2100 + 10⁶ + 10⁶。
- 策略二:自然连接,选择操作和投影输出。总读写数据块数为2100 + 10³ + 10³。
- 策略三:先进行选择操作,再连接和投影。总读写数据块数为200。
-
性能比较
- 第三种策略的执行代价是第一种的万分之一,是第二种的20分之一。
- 这展示了合理的查询优化可以极大提高查询效率。
-
查询优化的方法
- 连接操作的优化:减少中间结果的写出和读入。
- 先进行选择操作再连接(代数优化)。
- 利用索引进行选择和连接操作(物理优化)。
-
索引的影响
- 有索引时,可以只读取满足条件的元组,大大减少读取的数据量。
重点
- 查询优化的实际应用:理解不同的查询执行策略如何影响查询效率。
- 策略比较:理解三种不同的查询执行策略(广义笛卡尔积、自然连接和优化后的选择操作)及其对性能的影响。
- 优化技术的应用:了解代数优化和物理优化,如何通过减少中间结果的写出和读入、使用索引等方法提高查询效率。
难点
- 理解不同策略的效率差异:理解为什么某些查询策略比其他策略更高效,尤其是在大型数据集上的性能差异。
- 优化策略的选择:了解在不同情况下,为什么选择某种优化策略会更有效,例如何时使用自然连接而不是广义笛卡尔积。
- 索引的使用:理解索引在查询优化中的作用,包括它们如何减少必要的数据读取量。
易错点
- 误解查询效率:可能会错误地认为所有查询策略的效率大致相同,忽视了优化策略对性能的巨大影响。
- 过度依赖索引:虽然索引可以显著提高查询效率,但过度依赖索引(尤其是在不适当的情况下使用索引)可能会导致性能问题。
- 策略选择错误:在特定的查询和数据集中,选择不适合的查询执行策略(如在大数据集中使用广义笛卡尔积)可能会导致效率低下。