今天啥也没学 2023-04-06 20:17 采纳率: 81%
浏览 76
已结题

SQL数据库查询代价问题

教学管理数据库包含了学院表College(CollegeID,CollegeName)和教师表Teacher(TeacherID,TeacherName,CollegeID)。学院表College中已有20个学院信息,教师表Teacher中已有4000名教师信息。假定需要查询输出“软件学院”的教师名单,其查询SQL语句如下:


SELECT  A.CollegeName,  B.TeacherID,  B.TeacherName
FROM  College  AS  A,  Teacher  AS  B
WHERE  A.CollegeID=B.CollegeID AND A.CollegeName=’软件学院’

在执行处理该查询语句时,可以采用如下3种等价的关系运算表达式来解析该查询语句。

Q1=ΠA.CollegeName,B.TeacherID,B.TeacherName(σA.CollegeID=B.CollegeID L A.CollegeName=’软件学院’(College×Teacher))
Q2=ΠA.CollegeName,B.TeacherID,B.TeacherName(σA.CollegeName=’软件学院’(College∞Teacher))
Q3=ΠA.CollegeName,B.TeacherID,B.TeacherName(Teacher∞(σA.CollegeName=’软件学院’(College)))

1)研究分析Q1、Q2、Q3三种查询方案的执行代价,请选出一个最优查询方案。
2)在以上最优查询方案基础上,对College表和Teacher表的主外键列创建了索引,并且CollegeName列也创建了索引,其查询代价又如何?

  • 写回答

2条回答 默认 最新

  • san3334 2023-04-06 20:25
    关注

    针对以上三种查询方案的执行代价,可以进行以下分析:

    Q1:首先需要对两个表中的数据进行 JOIN 操作,由于表的大小都不是很大,因此可以使用 Nested Loop 连接算法。如果在 College 表的 CollegeName 列上创建索引,则可以加快筛选的速度。因此,可以认为 Q1 是一种较优的查询方案。
    Q2:首先对 College 表进行筛选,然后通过 CollegeID 列进行 JOIN 操作,这一步操作可以使用 Index Scan 算法,然后再对 TeacherName 列进行筛选。但是这种查询方案会多进行一次表的访问操作,不如 Q1 方案直接对两个表进行 JOIN 操作来得优秀。
    Q3:首先对 Teacher 表进行筛选,然后通过 CollegeID 列与 College 表进行 JOIN 操作,最后再对 CollegeName 列进行筛选。这种查询方案与 Q1 方案类似,但是先进行一次表的筛选操作,因此比 Q1 方案稍微劣一些。
    因此,可以认为 Q1 是最优查询方案。

    当对 College 和 Teacher 表的主外键列创建索引并且对 CollegeName 列也创建索引后,查询代价会进一步降低。具体的查询代价取决于索引的实现和数据分布情况,但是可以预期,这些索引的加入可以提高查询效率,特别是在 CollegeName 列上创建索引,因为它是查询条件中的一个关键字。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月16日
  • 已采纳回答 4月8日
  • 创建了问题 4月6日

悬赏问题

  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图