- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
【精选】第9章关系查询处理和查询优化
An Introduction to Database System 学习目标 理解查询处理的步骤 掌握查询优化的方法(重点+难点) 掌握代数优化的方法(重点) 掌握物理优化的方法(重点) 9.1 关系数据库系统的查询处理 任务:将用户的查询语句转换为高效的执行计划。 步骤:查询分析、查询检查、查询优化和查询执行。 选择操作的实现(全表扫描或索引扫描) [例1]SELECT * FROM Student WHERE Sno=200215121:设有Sno索引,由索引得到Sno为200215121的元组指针,通过该指针找到该学生。 WHERE Sage20:设有Sage索引,由索引找到Sage20的所有元组指针,通过这些指针找到所有年龄大于20的学生。 WHERE Sdept=‘CS’ AND Sage20:设有Sdept和Sage两个索引,先由索引分别找到Sdept=‘CS’和Sage20的两组元组指针,再求它们的交集,从而得到CS系中年龄20的学生。 连接操作的实现 [例2] SELECT * FROM Student,SC WHERE Student.Sno=SC.Sno 嵌套循环:对外层循环表Student的每个元组,检索内层循环表SC的每个元组,将Sno相等的Student元组与SC元组串接,直至Student表处理完毕。 排序合并 分别对Student表和SC表按连接属性Sno排序; 取Student表的第一个元组s; 依次扫描SC表,将Sno=s.Sno的SC元组分别与s串接; 当扫描SC表至第一个Sno≠s.Sno的元组时,返回Student表的下一个元组s。 重复3、4,直至Student表处理完毕。 索引连接 对SC表按连接属性Sno建立索引; 取Student表的第一个元组s; 由Sno索引扫描SC表,将Sno=s.Sno值的SC元组分别与s串接 取Student表的下一个元组s; 重复3、4,直至Student表处理完毕。 散列连接:将连接属性作为散列码。 划分阶段:将包含较少元组的Student表中的所有元组散列到相应桶中; 串接阶段:将SC表中的所有元组散列到相应桶中,并将同一桶中的Student元组与SC元组串接。 目标:选择有效的策略,使得查询代价最小。 查询代价=I/O代价+CPU代价+内存代价+通信代价 实例:求选修2号课程的学生姓名。? SELECT Sname FROM Student,SC WHERE Student.Sno=SC.Sno AND Cno=2 假设数据库中有1000个学生记录、10000个选课记录,其中选修2号课程的选课记录为50个。DBMS将上述SQL语句转化为如下几种等价的关系代数表达式: Q1:ПSname(?Student.Sno=SC.Sno∧Cno=2(Student×SC)) Q2:ПSname(?Cno=2(Student∞SC)) Q3:ПSname(Student∞(?Cno=2(SC)))? ПSname(?Student.Sno=SC.Sno∧Cno=2(Student×SC))? 笛卡尔积:假设内存中一次可存放5块Student元组、1块SC元组及若干块连接元组,一块能装10个Student元组或100个SC元组或10个连接元组,每秒读写200块,则: 读块数=读Student表块数+读SC表遍数×每遍块数 =1000/10+(1000/(10×5))*(10000/100)=2100=10.5秒。 连接元组数=1000*10000,写块时间=107/10/200=5000秒。 选择:读中间块,作选择运算时间=5000秒。 投影:时间可以忽略。 结论:查询总时间=(10.5+5000×2)秒=10010.5秒=2.78小时。 ПSname(?Cno=2(Student∞SC)) 自然连接:读取Student和SC表的策略不变,读取总块数为2100=10.5秒。但由于自然连接的结果为10000,所以写块时间为10000/10/200=5秒。? 选择:读中间块,作选择运算时间=5秒。? 投影:时间可以忽略。 结论:查询总时间=(10.5+5×2)秒=20.5秒。 ПSname(Student∞?Cno= 2(SC))? 选择:只需读一遍SC表,读块数=10000/100=0.5秒。因为满足条件的元组只有50个,不必使用中间文件写入外存。 自然连接:读取Student表,将读入元组和内存中的SC元组作连接,只需读一遍Student表,读块数=1000/10=0.5秒。? 投影:时间可以忽略。 ? 结论:查询总时间=(0.5+0.
文档评论(0)