关系型数据库工作原理-查询优化器之数据访问方式(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:《 How does a relational database work》。原文链接:http://coding-geek.com/how-databases-work/#Buffer-Replacement_strategies
本文翻译了如下章节, 介绍数据库查询优化器的数据访问方式:
Access Path–数据访问方法
在执行联表操作之前先要获取数据。现在讲一下获取数据有哪些方式。
Note:由于所有获取数据方式的关键都是磁盘I/O,所以我不会在这讨论时间复杂度的问题。
Full scan–全表扫描
如果你曾经阅读过介绍SQL执行方案的文档,你一定已知道full scan这个概念。
full scan是数据库将整张表的数据或者索引读取到内存。从磁盘I/O消耗来说,
全表数据扫描的成本明显比全表索引扫描要高很多。
Range Scan –区段扫描
还有其它的一些扫描方式,如:索引区段扫描。它用在数值范围做查询条件的时候(例如:WHERE AGE > 20 AND AGE <40)。当然,你必须得为AGE字段建立了索引才能使用索引区段扫描。
我们已在第一章讲了,区间查询的时间复杂度是log(N) +M,其中N是建立索引的数据条数,M是区间内的数据条数。M和N的值已经在数据特征统计时计算出来了(Note:M是条件断言AGE >20 AND AGE<40的可选元素)。对于区段扫描你甚者不需要读取全部的索引数据,因此它的磁盘I/O成本比全表数据扫描小得多。
Unique scan–唯一值扫描
当你仅需要查询指定索引的单条记录,你可以使用唯一值扫描。
Access by row id–根据行ID获取(数据)
大多数情况,如果数据库建立了索引,它将查询与索引关联的行记录,它将使用行ID去获取数据。
例如下面的SQL语句:
如果你已对person表的age字段建了索引,优化器将使用索引找到所有age是28(的行ID),然后从表中查询出对应的行数据记录。索引仅包含了age信息,你需要的是lastname和firstname,这些需要从原表中去拿。
但是,如果你执行下面的SQL:
SELECT TYPE_PERSON.CATEGORY from PERSON ,TYPE_PERSON WHERE PERSON.AGE = TYPE_PERSON.AGE
PERSON表的索引将用于与TYPE_PERSON表做关联,但不会用row id去查询数据,因为不需要查PERSON表中的其它信息。
在需要查询少量数据的时候没什么问题。关键的瓶颈在磁盘I/O,如果你需要根据row id查询太多数据,数据库可能会使用全表数据扫描(代替)。
Others paths–其它方法
我并未介绍所有的数据获取方式。你想了解更多可以阅读oracle官方文档。
上面讲的获取方式名称,在不同的数据库中可能有不同的叫法,但是背后的含义是一致的。
关系型数据库工作原理-查询优化器之数据访问方式(翻译自Coding-Geek文章)的更多相关文章
- 关系型数据库工作原理-查询优化器之索引(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>.原文链接:http://coding-geek.com/how-data ...
- 关系型数据库工作原理-查询优化器(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>.原文链接:http://coding-geek.com/how-data ...
- 关系型数据库工作原理-归并排序(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...
- 关系型数据库工作原理-时间复杂度(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...
- 关系型数据库工作原理-事务管理(一)(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...
- 关系型数据库工作原理-高速缓存(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...
- 关系型数据库工作原理-事务管理(二)(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...
- 关系型数据库工作原理-快速缓存(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...
- 关系型数据库工作原理-数据特征统计分析(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>.原文链接:http://coding-geek.com/how-data ...
随机推荐
- MySQL的InnoDB引擎与MyISAM引擎
MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与 ...
- 由select引发的思考
一.前言 网络编程里一个经典的问题,selec,poll和epoll的区别?这个问题刚学习编程时就接触了,当时看了材料很不明白,许多概念和思想没有体会,现在在这个阶段,再重新回头看这个问题,有一种豁然 ...
- UVa 11988破损的键盘
这题是很好的学习用数组实现链表的例子. 原题链接 UVa11988 题意 输入一段文本,字符'['表示Home键,']'表示End键.输出屏幕上面的结果. 思路 难点在于在字符串的头和尾插入字符,如果 ...
- 如何修改全部DevExpress控件的字体
引用:https://www.devexpress.com/Support/Center/Question/Details/A2761 You can change the default font ...
- 1000多个项目中的十大JavaScript错误以及如何避免
通过统计数据库中的1000多个项目,我们发现在 JavaScript 中最常出现的错误有10个.下面会向大家介绍这些错误发生的原因以及如何防止. 对于这些错误发生的次数,我们是通过收集的数据统计得出的 ...
- 2_Add Two Numbers --LeetCode
原题如下: 思路:在一个while中遍历两个链表,直到最长的链表为空,或者没有进位.每一步获取两个链表对应的结点的值a,b,然后相加a+b.如果上一步又进位,那就加a+b+1,若由于进位加1后还产生进 ...
- Eviews 9.0新功能——估计方法(ARDL、面板自回归、门限回归)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 9.2 估计功能 eviews9.0下载链接: ...
- dojo省份地市级联之地市Dao接口类(四)
dojo省份地市级联之地市Dao接口类 CityDao.java: /** * 地市 */ package com.you.dao; import java.util.List; import com ...
- WebService之CXF注解报错(二)
WebService之CXF注解 1.具体报错如下 五月 04, 2014 11:24:12 下午 org.apache.cxf.wsdl.service.factory.ReflectionServ ...
- freemarker自定义标签报错(一)
freemarker自定义标签 1.错误描述 freemarker.core.ParseException: Token manager error: freemarker.core.TokenMgr ...