zoukankan      html  css  js  c++  java
  • 数据库系统世界

    数据库管理系统概述

    下图描述了一个完整的DBMS结构,其中单线框表示系统构成,双线框表示内存中的数据结构,实线表示控制和数据流,虚线只表示数据流。由于图很复杂,因此分几个步骤来考虑细节。

    image

    首先,在顶部有两个命令源将命令发给DBMS:

    1、通常的用户和应用程序,发出查询数据或修改数据命令。

    2、数据库管理员,一个人或者一批人负责数据库结构或模式。

    数据定义语言命令

    第二种命令的处理比较简单,上图中右上方显示命令行踪的开始。例如,大学生注册数据库的管理员或DBA,可以确定该数据库中应该有一个表或关系,该关系的列是由学生、该学生选修的课程和该学生课程的成绩组成。DBA还可以确定有效成绩只能是A、B、C、D和F。这些结构和约束信息都是数据库模式的一部分。在上图中显示由DBA输入。由于这些命令能深深的影响数据库,所以DBA必须具备特殊的权限才能执行模式修改命令。模式修改数据定义语言(DDL)命令由DDL处理器分析,并且传送给执行引擎,然后执行引擎再通过索引/文件/记录管理器去修改元数据,也就是数据库的模式信息。

    查询处理概述

    与DBMS交互最主要的工作是沿着上图中左边的路径。用户或应用程序使用数据操作语言(DML)启动一些不影响数据模式的操作,但是这些操作可能会影响数据库的内容(例如修改操作)。DML语言由两个独立的子系统处理,有关这两个子系统的叙述如下:

    查询处理

    查询通过查询编译器完成语法分析和优化。编译的结果是查询计划或者是由DBMS执行并获得查询结果的操作序列,它们将被送给执行引擎。执行引擎向资源管理器发出一系列获取小块数据的请求,典型的小块数据关系是记录或元组。资源管理器知道数据文件、数据文件的格式和记录大小以及索引文件等。这些信息对于快速从数据文件中找到相应数据元素是有用的。

    数据请求又被传送给缓冲区管理器。缓冲区管理器的任务是从二级存储器(通常是磁盘,永久的保存数据)中获取数据送入主存缓冲区中。一般情况下,页或“磁盘块“是缓冲区和磁盘间的传送单位。

    为了从磁盘中得到数据,缓冲区管理器与存储器管理器进行通信。存储器管理器可能包含操作系统命令,但是更典型的是DBMS直接向磁盘控制器发命令。

    事务处理

    查询或者其他DML操作被组织成事务(transaction)。事务必须是原子性执行的单位,执行中的事务之间还必须相互隔离。任何一个查询或者修改操作本身就可以是一个事务。另外,事务的执行必须持久(durable),也就是说任何已完成事务的作用必须被保持,即使事务刚刚完成系统就失败的情况也得如此。事务处理器被划分成两个主要部分:

    1、并发控制管理器(concurrency-control manager)或调度器(scheduler),保证事务的原子性和独立性。

    2、日志(logging)和恢复管理器(recovery manager),负责事务的持久性。

    存储器和缓冲区管理器

    数据库数据平时存储在二级存储器中。计算机系统中的”二级存储器“一般指磁盘。可是,对数据的操作只能在主存中执行。存储器管理器的主要任务就是控制数据在磁盘上的位置存放和在磁盘与主存间的移动。

    在一个简单的数据库系统中,存储器管理器可以就是操作系统的文件系统。可是,为了提高效率,DBMS常常直接控制磁盘上的存储,至少是在某些环境下如此。存储器管理器保持跟踪磁盘上的文件位置,根据请求从缓冲区管理器中获取含有请求文件的一个或多个磁盘块。

    缓冲区管理器负责把可用主存分割成缓冲区,缓冲区是包含若干个页面的区域,其中可以传输磁盘块。于是,所有需要从磁盘中获取信息的DBMS组件,都或是直接或是通过执行引擎的方式,与缓冲区和缓冲区管理器交互。各个组件可能需要的信息种类有:

    1、数据:数据库本身的内容。

    2、元数据:描述数据库结构及其约束的数据库模式。

    3、日志记录:对数据库新近修改的信息,该信息支持数据库的持久性。

    4、统计数据:由DBMS收集和存储的关于数据特征的数据。例如,数据库大小、数据库中的值、数据库中各种关系和其他成分。

    5、索引:支持对数据库中数据有效存取的数据结构。

    事务处理

    通常将一个或者一组数据库操作组成一个事务。事务的执行满足原子性,并且与其他事务的执行相互隔离。另外,DBMS还要保证事务的持久性:已完成事务的工作永不丢失。事务管理器接收来自应用的事务命令,这些命令告诉事务管理器事务何时开始,何时结束,以及应用期望的信息(例如,某些应用可能不需要原子性)。事务处理器执行如下一些任务:

    1、记日志(logging):为了保证持久性,数据库的每一个变化都单独的记录在磁盘上。日志管理器(log manager)遵循一种设计原则,无论何时系统失败或”崩溃“,恢复管理器都能通过检查日志的中的修改记录,把数据库恢复到某个一致状态。日志管理器先把日志写入缓冲区,然后与缓冲区管理器协商以确保缓冲区在合适的时间被写入磁盘(磁盘数据可以在系统崩溃后幸存下来)。

    2、并发控制(concurrency control):事务必须独立执行。但是大多数系统中,很多事务都是同时在执行。因此,调度器(并发控制管理器)必须保证多个事务的单个动作是按某个次序在执行,按该次序执行的效果应该与系统一次只执行一个事务一样。典型的调度器是通过在数据库的某些片段上加锁的方式工作。锁将防止两个事务用不正确的交互方式对同一数据片段存取。如上图所示,锁通常保存在主存的锁表中,调度器通过阻止执行引擎对已加锁的数据库内容的存取来影响查询和其他数据库操作。

    3、消除死锁(deadlock resolution):当事务通过调度器获取锁以竞争其所需的资源时,系统可能会陷入一种状态。在该状态中,因为每个事务需要的资源都被另一个事务占有,所以没有一个事务能够继续执行。此时,事务管理器有责任调解,并删除(”回滚“或”终止“)一个或多个事务,以便其他事务可以继续执行。

    事务的ACID性质
    正确实现的事务通常应满足以下“ACID”性质:
    A(Automicity)表示原子性,事务的操作要么全部被执行,要么全部不被执行
    I(isolation)表示独立性,每个事务必须如同没有其他事务在同时执行一样被执行
    D(durability)表示持久性,一旦事务已经完成,则该事务对数据库的影响就永远不会丢失
    C(consistency)表示一致性,也就是说,所有数据库中数据元组之间的联系具有一致性约束,或说满足一致性期望(例如,事务执行结束后账户余额不能是负数),即期望事务能保持数据库的一致性。

    查询处理器

     

    用户可以感受到的最影响系统性能的DBMS部分是查询处理器。上图中查询处理器用两个组件表示:

    1、查询编译器:它把查询转换成查询计划的内部形式。查询计划是在数据上的操作序列。通常,查询计划中的操作用“关系代数”运算实现。查询编译器主要由以下三个模块组成:

    a) 查询分析器:查询分析器是从查询的文本结构中构造一个查询树结构。

    b)查询预处理器:查询预处理器对查询进行语义查询(例如,确保查询中提到的关系确实存在),并且将查询语法树转换成表示初始查询计划的代数操作符树。

    c)查询优化器:查询优化器将查询初始计划转换成在实际数据上执行最有效的操作序列。

    查询编译器使用关于数据的元数据和统计数据,以确定哪种操作序列最快。例如,索引是一种特殊的便于数据存取的数据结构,如果索引存在,并且给定索引数据项值,则利用索引的查询计划将比其他计划更快。

    2、执行引擎:

    执行引擎:执行引擎负责执行选定查询计划的每一步。执行引擎与DBMS其他的大部分组件都直接地或通过缓冲区交互访问。为了对数据进行操作,它必须从数据库中将数据取到缓冲区,必须与调度器交互访问以避免存取已加锁的数据,它还要与日志管理器交互访问以确保所有数据库的变化都正确地被日志记录。

  • 相关阅读:
    面试容易问到的Linux问题
    Java面试题复习笔记(框架)
    Java面试题复习笔记(前端)
    Java面试题复习笔记(数据库)
    Java面试题复习笔记(Web方向)
    【刷题-LeetCode】191 Number of 1 Bits
    【数学】随机方法计算逆矩阵
    【刷题-LeetCode】190 Reverse Bits
    【刷题-LeetCode】188 Best Time to Buy and Sell Stock IV
    python 30 面向对象之 多态
  • 原文地址:https://www.cnblogs.com/Jiaoxia/p/4011341.html
Copyright © 2011-2022 走看看