关系查询处理和查询优化
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Biblioteka Baidu
二、连接操作的实现
例2 SELECT * FROM Student,SC WHERE Student.Sno=SC.Sno ; 1、嵌套循环方法(nested loop)
简单。对外层循环Student的每一个元组,检查内层循环SC中的每 一个元组,并检查连接属性是否相等
2、排序-合并方法(sort-merge join)
二、连接操作的实现
3、索引连接法
①在SC上建立属性Sno索引; ②对Student的每一个元组,由Sno值通过索引查找相应SC元组; ③把这些SC元组和Student元组连接起来; 循环执行②③,直到Student元组处理完。
4、Hash Join方法
把连接属性作为Hash码,用同一个Hash函数把R和S中的元组散 列到同一个Hash文件中; 第一步,划分阶段,对小表R进行一遍处理,把它的元组按Hash 函数分散到Hash表的桶中;(假设:R完全装入内存) 第二步,试探阶段(连接阶段),对表S进行一遍处理,把它的 元组散列到适当的Hash桶中,并把元组与来自R并与之匹配的元 组连接起来。
9.2 关系数据库系统的查询优化
9.2.1 查询优化概述
查询优化的必要性 查询优化极大地影响RDBMS的性能。 查询优化是RDBMS关键技术、关系系统的优点 (关系系统:支持表结构、选择连接(自然)操作) 查询优化的可能性 关系表达式语义的级别很高,使DBMS可以从关 系表达式中分析查询语义。
由DBMS进行查询优化的好处
用户不必考虑如何最好地表达查询以获得较好的效率 系统可以比用户程序的优化做得更好
(1) 优化器可以从数据字典中获取许多统计信息,而用户程序则 难以获得这些信息 (2) 如果数据库的物理统计信息改变了,系统可以自动对查询重 新优化以选择相适应的执行计划。 在非关系系统中必须重写程序,而重写程序在实际应用中往往 是不太可能的 (3) 优化器可以考虑数百种不同的执行计划,而程序员一般只能 考虑有限的几种可能性。 (4) 优化器中包括了很多复杂的优化技术
写中间结果时间 = 10000000/10/20 = 50000秒
②б 读数据时间 = 50000秒 ③П 总时间 =105+50000+50000秒 = 100105秒 = 27.8小时
执行策略2
Q2= ПSname(бSC.Cno=' 2' (Student SC)) ① 读取总块数= 2100块 读数据时间=2100/20=105秒 中间结果大小 =10000 (减少1000倍) 写中间结果时间 =10000/10/20=50秒 ②б 读数据时间=50秒 ③П 总时间=105+50+50秒=205秒=3.4分
常用,适合有序表 步骤: ① 若没排序,首先对Student、SC按连接属性Sno排序; ② 取Student第一个Sno,一次扫描SC中具有相同Sno元组,连接 起来; ③ 当扫描到SC中第一个不相同Sno元组时,返回Student扫描下一 个元组,在扫描SC中具有相同Sno元组,把它们连接起来; 重复上述步骤,直到Student扫描完。
假设1:外存: Student:1000条,SC:10000条, 选修2号课程:50条 假设2: 一个内存块装元组:10个Student, 或100个SC或10个连接结果元组 ; 内存中一次可以存放: 5块Student元组, 1块SC元组 假设3:读写速度:20块/秒 假设4:连接方法:基于数据块的嵌套循环法
第九章 关系查询处理及其查询优化
9.1 关系数据库系统的查询处理
9.2 关系数据库系统的查询优化
9.3 代数优化
9.4 物理优化
---关系代数表达式的优化
---存取路径和底层操作算法的选择
9.1关系数据库系统的查询处理
查询处理的任务:是把用户提交给RDBMS的查询语句转
换为高效的执行计划. 9.1.1查询处理步骤
查询分析 查询检查
查询优化
查询执行
9.1.1查询处理步骤: 查询语句
查询 分析 词法分析 语法分析 语义分析 符号名转换 安全性检查 完整性检查 查询树 查询 优化 代数优化 物理优化等 执行策略描述 查询 执行 代码生成 查询计划的执行代码 数据库 数据字典
查询 检查
9.1.2实现查询操作的算法示例
一、选择操作的实现
例1 SELECT * FROM Student WHERE <条件表达式>; <条件表达式>:C1:无条件
C2:Sno=‘200215121’; C3:Sage >20; C4:Sdept=‘CS’ AND Sage>20;
1、简单的全表扫描方法 顺序扫描,逐一检查每个元组是否满足选择条件,把满足条件的 元组作为结果输出。 适合:小表 2、索引(或散列)扫描方法 如果条件表达式的属性上有索引(如B+树索引或Hash索引),通过 索引先找到满足条件的元组主码或元组指针,再通过元组指针直接 在查询的基本表中找到元组。如 C2:
执行策略1
Q1= ПSname(бStudent.Sno=SC.Sno ∧SC.Cno='2' (Student×SC))
① Student×SC
读取总块数= 读Student表块数 + 读SC表遍数 *每遍块数 =1000/10+(1000/(10×5)) ×(10000/100) =100+20×100=2100 读数据时间=2100/20=105秒 中间结果大小 = 1000*10000 = 107 (1千万条元组)
执行策略3
Q2= ПSname(Student
бSC.Cno=' 2' (SC))
代价模型
集中式数据库
总代价 = I/O代价 + CPU代价 + 内存代价
分布式数据库
总代价 = I/O代价 + CPU代价+ 内存代价 + 通信代价
查询优化的总目标:
选择有效策略,求得给定关系表达式的值,使得查询代价最小。
9.2.2 一个实例
例:求选修了课程C2的学生姓名
SELECT Student.Sname FROM Student, SC WHERE Student.Sno=SC.Sno AND SC.Cno='2';
二、连接操作的实现
例2 SELECT * FROM Student,SC WHERE Student.Sno=SC.Sno ; 1、嵌套循环方法(nested loop)
简单。对外层循环Student的每一个元组,检查内层循环SC中的每 一个元组,并检查连接属性是否相等
2、排序-合并方法(sort-merge join)
二、连接操作的实现
3、索引连接法
①在SC上建立属性Sno索引; ②对Student的每一个元组,由Sno值通过索引查找相应SC元组; ③把这些SC元组和Student元组连接起来; 循环执行②③,直到Student元组处理完。
4、Hash Join方法
把连接属性作为Hash码,用同一个Hash函数把R和S中的元组散 列到同一个Hash文件中; 第一步,划分阶段,对小表R进行一遍处理,把它的元组按Hash 函数分散到Hash表的桶中;(假设:R完全装入内存) 第二步,试探阶段(连接阶段),对表S进行一遍处理,把它的 元组散列到适当的Hash桶中,并把元组与来自R并与之匹配的元 组连接起来。
9.2 关系数据库系统的查询优化
9.2.1 查询优化概述
查询优化的必要性 查询优化极大地影响RDBMS的性能。 查询优化是RDBMS关键技术、关系系统的优点 (关系系统:支持表结构、选择连接(自然)操作) 查询优化的可能性 关系表达式语义的级别很高,使DBMS可以从关 系表达式中分析查询语义。
由DBMS进行查询优化的好处
用户不必考虑如何最好地表达查询以获得较好的效率 系统可以比用户程序的优化做得更好
(1) 优化器可以从数据字典中获取许多统计信息,而用户程序则 难以获得这些信息 (2) 如果数据库的物理统计信息改变了,系统可以自动对查询重 新优化以选择相适应的执行计划。 在非关系系统中必须重写程序,而重写程序在实际应用中往往 是不太可能的 (3) 优化器可以考虑数百种不同的执行计划,而程序员一般只能 考虑有限的几种可能性。 (4) 优化器中包括了很多复杂的优化技术
写中间结果时间 = 10000000/10/20 = 50000秒
②б 读数据时间 = 50000秒 ③П 总时间 =105+50000+50000秒 = 100105秒 = 27.8小时
执行策略2
Q2= ПSname(бSC.Cno=' 2' (Student SC)) ① 读取总块数= 2100块 读数据时间=2100/20=105秒 中间结果大小 =10000 (减少1000倍) 写中间结果时间 =10000/10/20=50秒 ②б 读数据时间=50秒 ③П 总时间=105+50+50秒=205秒=3.4分
常用,适合有序表 步骤: ① 若没排序,首先对Student、SC按连接属性Sno排序; ② 取Student第一个Sno,一次扫描SC中具有相同Sno元组,连接 起来; ③ 当扫描到SC中第一个不相同Sno元组时,返回Student扫描下一 个元组,在扫描SC中具有相同Sno元组,把它们连接起来; 重复上述步骤,直到Student扫描完。
假设1:外存: Student:1000条,SC:10000条, 选修2号课程:50条 假设2: 一个内存块装元组:10个Student, 或100个SC或10个连接结果元组 ; 内存中一次可以存放: 5块Student元组, 1块SC元组 假设3:读写速度:20块/秒 假设4:连接方法:基于数据块的嵌套循环法
第九章 关系查询处理及其查询优化
9.1 关系数据库系统的查询处理
9.2 关系数据库系统的查询优化
9.3 代数优化
9.4 物理优化
---关系代数表达式的优化
---存取路径和底层操作算法的选择
9.1关系数据库系统的查询处理
查询处理的任务:是把用户提交给RDBMS的查询语句转
换为高效的执行计划. 9.1.1查询处理步骤
查询分析 查询检查
查询优化
查询执行
9.1.1查询处理步骤: 查询语句
查询 分析 词法分析 语法分析 语义分析 符号名转换 安全性检查 完整性检查 查询树 查询 优化 代数优化 物理优化等 执行策略描述 查询 执行 代码生成 查询计划的执行代码 数据库 数据字典
查询 检查
9.1.2实现查询操作的算法示例
一、选择操作的实现
例1 SELECT * FROM Student WHERE <条件表达式>; <条件表达式>:C1:无条件
C2:Sno=‘200215121’; C3:Sage >20; C4:Sdept=‘CS’ AND Sage>20;
1、简单的全表扫描方法 顺序扫描,逐一检查每个元组是否满足选择条件,把满足条件的 元组作为结果输出。 适合:小表 2、索引(或散列)扫描方法 如果条件表达式的属性上有索引(如B+树索引或Hash索引),通过 索引先找到满足条件的元组主码或元组指针,再通过元组指针直接 在查询的基本表中找到元组。如 C2:
执行策略1
Q1= ПSname(бStudent.Sno=SC.Sno ∧SC.Cno='2' (Student×SC))
① Student×SC
读取总块数= 读Student表块数 + 读SC表遍数 *每遍块数 =1000/10+(1000/(10×5)) ×(10000/100) =100+20×100=2100 读数据时间=2100/20=105秒 中间结果大小 = 1000*10000 = 107 (1千万条元组)
执行策略3
Q2= ПSname(Student
бSC.Cno=' 2' (SC))
代价模型
集中式数据库
总代价 = I/O代价 + CPU代价 + 内存代价
分布式数据库
总代价 = I/O代价 + CPU代价+ 内存代价 + 通信代价
查询优化的总目标:
选择有效策略,求得给定关系表达式的值,使得查询代价最小。
9.2.2 一个实例
例:求选修了课程C2的学生姓名
SELECT Student.Sname FROM Student, SC WHERE Student.Sno=SC.Sno AND SC.Cno='2';