数据库技术chapter4.ppt

  1. 1、本文档共36页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据库技术chapter4

查询优化的一般准则 选择运算应尽可能先做 ? 目的:减小中间关系 在执行连接操作前对关系适当进行预处理 按连接属性排序 在连接属性上建立索引? 投影运算和选择运算同时做 目的:避免重复扫描关系 将投影运算与其前面或后面的双目运算结合 目的:减少扫描关系的遍数 优化的一般步骤 1) 把查询转换成某种内部表示 2) 代数优化:把语法树转换成标准(优化)形式 3) 物理优化:选择低层的存取路径 4) 生成查询计划,选择代价最小的 优化的一般步骤 例:求选修了课程C2的学生姓名 SELECT Student.Sname FROM Student, SC WHERE Student.Sno=SC.Sno AND SC.Cno=‘C2; (1)把查询转换成某种内部表示 (2)代数优化 利用优化算法把语法树转换成标准(优化)形式 ? (3)物理优化:选择低层的存取路径 - 优化器查找数据字典获得当前数据库状态信息 选择字段上是否有索引 连接的两个表是否有序 连接字段上是否有索引 然后根据一定的优化规则选择存取路径 ? 如例中若SC表上建有Cno的索引,则应该利用这个索引,而不必顺序扫描SC表。 (4)生成查询计划,选择代价最小的 在作连接运算时,若两个表(设为R1,R2)均无序,连接属性上也没有索引,则可以有下面几种查询计划: 对两个表作排序预处理 对R1在连接属性上建索引 对R2在连接属性上建索引 在R1,R2的连接属性上均建索引 对不同的查询计划计算代价,选择代价最小的一个。 在计算代价时主要考虑磁盘读写的I/O数,内存CPU处理时间在粗略计算时可不考虑。 8)使用临时表,加快查询速度 现在把所有饭卡余额为200的学生放在一张临时表SC1中。 SELECT Sname,School INTO SC1 FROM Table_Student S JOIN Table_Card C ON S.CardID=C.CardID WHERE Balance=200 ORDER BY Sname 然后,在临时表中查询外语学院饭卡余额为200的学生。 SELECT * FROM SC1 WHERE School=外语学院 图4.25 使用临时表的执行情况 9)避免使用外连接 外连接包含与NULL数据匹配的数据,其代价可能非常高。 例4-19 查询没有进行消费的饭卡号和余额。 第一个查询语句采用左外连接。 SELECT C.CardID ,Balance FROM Table_Card C LEFT JOIN Table_Salebill S ON C.CardID=S.CardID WHERE S.CardID IS NULL; 第二个查询语句不使用外连接。 SELECT C.CardID ,Balance FROM Table_Card C WHERE C.CardID NOT IN (SELECT DISTINCT S.Cardid FROM Table_Salebill S) 10)尽量避免使用非打头字母有哪些信誉好的足球投注网站 使用非打头字母有哪些信誉好的足球投注网站会造成引擎无法利用索引。 例4-20 第一个查询语句是查询饭卡号以“00010”开头的饭卡数量。 SELECT count(*) FROM Table_Card WHERE CardID LIKE 00010% 第二个查询语句是查询饭卡号中有“00010”的饭卡数量。 SELECT count(*) FROM Table_Card WHERE CardID LIKE %00010% 11) 一般EXISTS比IN性能好 例4-21 查询名字不与别人相同的学生信息。 第一个查询使用EXISTS。 SELECT * INTO s1 FROM Table_Student WHERE EXISTS (SELECT DISTINCT Sname FROM Table_Student) 第二个查询使用IN 。 SELECT * INTO s2 FROM Table_Student WHERE Sname IN (SELECT DISTINCT Sname FROM Table_Student) 本 章 小 结 合理使用索引是实现查询优化的首要前提: 在经常被作为查询条件使用的列上建立索引; 在频繁进行排序或分组的列上建立索引; 在值域很大的列上建立索引; 当数据表更新大量数据时,删除并重建索引可以提高更新速度; 组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列; 在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引

文档评论(0)

asd522513656 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档