SQL堆表为login属性建索引时的查询评估计划解答
堆表+login索引场景下的查询评估计划作答方法
这类考察物理查询处理的题目,作答时必须紧扣给定的存储结构前提,按执行顺序拆解数据库的实际物理操作,不能只停留在"查匹配值返回结果"的逻辑层面泛泛而谈。
题目给定条件
- Student表为堆表结构:数据按写入顺序无序存储在数据页中,通过行ID(RID,即记录的物理地址指针)定位单条记录的具体位置
login字段上已创建二级(非聚簇)索引- 待评估查询语句:
SELECT * from Student where login='kra2286'
完整查询评估计划步骤
- 访问路径决策:查询优化器估算执行代价后,放弃全表扫描方案,选择通过
login列上的二级索引完成查询,该路径代价远低于遍历整个堆表 - 索引扫描定位匹配项:数据库从
login索引的B+树根节点开始,通过页内二分查找逐层向下遍历,最终定位到索引键值等于'kra2286'的叶子节点条目,提取条目中存储的两个核心信息:索引键值本身、匹配记录在堆表中的RID;如果login字段建了唯一约束,这一步只会拿到1条匹配索引项,非唯一索引场景下可能拿到多条 - 回表读取完整行数据:因为查询要求返回所有列(
SELECT *),而二级索引的叶子节点只存索引键和对应的RID,不存Student表其他字段的值,所以需要用上一步拿到的每个RID,到堆表对应的数据页偏移位置,读取该条记录的全列数据;堆表数据无序存储的特性,决定了这一步的读取是随机IO操作 - 结果返回:将回表拿到的完整匹配记录直接返回给客户端即可,这个查询是等值精确匹配,不需要额外做排序、二次过滤、聚合之类的操作
原答案丢分原因
原答案只描述了查询的逻辑目标,完全没覆盖物理执行的核心考点:既没说明优化器选择索引访问路径、索引扫描的具体逻辑,也没提到堆表搭配二级索引查询时必须的回表操作,完全没涉及物理数据库设计、查询处理模块的核心知识点,所以会被判错。
内容的提问来源于stack exchange,提问作者Goal
相关产品推荐
相关产品推荐

