本文翻译自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文章)的更多相关文章

  1. 关系型数据库工作原理-查询优化器之索引(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>.原文链接:http://coding-geek.com/how-data ...

  2. 关系型数据库工作原理-查询优化器(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>.原文链接:http://coding-geek.com/how-data ...

  3. 关系型数据库工作原理-归并排序(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...

  4. 关系型数据库工作原理-时间复杂度(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...

  5. 关系型数据库工作原理-事务管理(一)(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...

  6. 关系型数据库工作原理-高速缓存(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...

  7. 关系型数据库工作原理-事务管理(二)(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...

  8. 关系型数据库工作原理-快速缓存(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...

  9. 关系型数据库工作原理-数据特征统计分析(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>.原文链接:http://coding-geek.com/how-data ...

随机推荐

  1. 图论算法-Tarjan模板 【缩点;割顶;双连通分量】

    图论算法-Tarjan模板 [缩点:割顶:双连通分量] 为小伙伴们总结的Tarjan三大算法 Tarjan缩点(求强连通分量) int n; int low[100010],dfn[100010]; ...

  2. xBIM WeXplorer xViewer的导航,相机、剖切、隐藏 等操作

    目录 基础 xBIM WeXplorer 简要介绍 xBIM WeXplorer xViewer 基本应用 xBIM WeXplorer xViewer 浏览器检查 xBIM WeXplorer xV ...

  3. [翻译]编写高性能 .NET 代码 第二章:垃圾回收

    返回目录 第二章:垃圾回收 垃圾回收是你开发工作中要了解的最重要的事情.它是造成性能问题里最显著的原因,但只要你保持持续的关注(代码审查,监控数据)就可以很快修复这些问题.我这里说的"显著的 ...

  4. iOS程序闪退的原因以及处理办法

    iOS程序闪退是一种比较常见的现象.闪退的情况很多,造成程序闪退的原因也很多. ================================启动时闪退======================= ...

  5. C语言_结构体的4种定义初始化方式及案例

    结构体是一种构造数据类型 (构造数据类型:数组类型.结构体类型(struct).共用体类型(union)).用途:把不同类型的数据组合成一个整体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一 ...

  6. 遇见JMS[1] —— activeMQ的简单使用

    1.JMS Java Message Service,提供API,供两个应用程序或者分布式应用之间异步通信,以传送消息. 2.相关概念 提供者:实现JMS规范的消息中间件服务器客户端:发送或接收消息的 ...

  7. BUNOJ 1011

    字符串处理的题.原题链接 AC代码: #include<cstring> #include<cstdio> #include<string> #include< ...

  8. 使用C#解决部分Win8.1系统窗口每隔几秒失去焦点的问题【转】

    使用了Win8.1 With Update 1后,发现重启系统后,当前激活的窗口总是每隔几秒失去焦点,过0.5~1秒焦点回来,导致输入无法正常工作,严重影响使用心情和效率. 在网上找了很久,也没找到相 ...

  9. 关于instrinsicContentSize, ContentHuggingPriority, ContentcompressionResistancePriority的理解

    ios 关于intrinsic理解 最近由于项目的需要想给MBProgressHUD添加一个自定义的view, 结果花费了一两个小时也没添加上去,添加上去的view没有实际的大小,即使你给他设置了一个 ...

  10. java中servletContextListener、httpSessionListener和servletRequestListener使用整理

    在java web应用中,listener监听器似乎是必不可少的,常常用来监听servletContext.httpSession.servletRequest等域对象的创建.销毁以及属性的变化等等, ...