深度对比Oracle与SQL Server 联系客服

发布时间 : 星期一 文章深度对比Oracle与SQL Server更新完毕开始阅读0b7d1f64910ef12d2bf9e79f

最后,你可以通过下面语句来查看SGA各个组件的情况:

1

SELECT * FROM V$SGAINFO

下面的命令用来查看分配给Oracle实例的总内存数:

1

SHOW PARAMETER SGA_MAX_SIZE;

要查看一个实例上运行的Oracle进程情况可以使用下面的语句:

1

SELECT NAME, DESCRIPTION FROM V$BGPROCESS ORDER BY NAME

6.2.2. MS SQL实例结构

在一个运行着的Microsoft SQL Server实例上,同样维护者一些内部的内存结构和后台进程,不过不像Oracle那样,SQL Server并没有公开的详细解释内部工作和架构的文档。

自2005版以后,SQL Server引入了一个叫SQLOS(SQL Operating System)的东西,不过跟名字所显示的不一样的是,这个东西既不是一个操作系统,也不是对于OS API的一个封装。它并不是一个通向非Windows平台的桥梁或是一个用于框架开发的类库。

SQLOS是一套用于通过优化与Windows系统接口而为SQL Server存储和数据库引擎提供关键服务的软件,Windows是一个通用的OS:它并没有为SQL Server而做特别的优化。SQLOS则担当替代Windows而为SQL Server和管理核心系统服务的,SQLOS提供的服务包括:

? 内存管理 ? 资源管理 ? 检测和管理死锁 ? 异常处理 ? CLR组件托管

? 包括专用管理连接(Dedicated Administrator Connection, DAC)和动态管理视图(Dynamic

Management Views, DMV)在内的诊断功能

? 调度管理(马上开讲)

Windows下的应用程序都是运行在独立的、受保护的内存空间上,这些内存空间被称为虚拟地址空间(Virtual Address Spaces, VAS)。因为每个应用的VAS都是不一样的,因此一个应用是不能往另外一个应用的地址空间做写入操作的,这样保证了程序不会因为严重的违规访问而崩溃。分配给应用的VAS可能来自于物理内存或者是页面文件,又或者是两者都有。页面文件(paging file)又称交换文件(swap file)是一个被Windows内存管理器用来存放那些无法放进物理内存的数据的,这些数据被写入到交换文件中,在应用需要的时候被读取出来。当中所涉及到的虚拟内存地址与物理内存地址之间的转换(在RAM和页面文件中)时由Windows内存管理器完成。从应用的角度来说,它并不关心它的内存究竟是存在什么地方的。对32位的Windows系统,OS所能寻址的最大的VAS地址空间是4GB,默认情况下这当中的2G供操作系统内核使用,剩下的2G提供给像SQL Server之类的应用使用。不过通过修改boot.ini中的开关(3G开关)设置可以让Windows只给自己分配1G而剩下3G给应用使用。要想在32位的机器上使用超过4GB内存的话,SQL Server可以通过地址窗口化扩展插件(Adress Windowing Extension, AWE)机制利用超出限制的内存。

在64位的系统上面Windows的内存寻址通常就不是个问题了,因为此时的Windows可寻址的VAS空间达16TB。

作为同样是Windows应用的SQL Server,自然也是无法独立于VAS规则之外的了。当SQL Server启动之后,数据库引擎就只能看到自己的VAS空间,缓存池(buffer pool)也就放在这个空间里面。缓存池缓存的是SQL Server数据:它由8KB大小缓存组成,缓存了来自数据文件的数据页,这个类似于Oracle的数据块缓存区。在VAS中的数据库引擎由SQLSERVER.EXE程序,各个DLL库以及线程结构组成。

缓存池的大小受限于两个组件:机器可用的物理内存和SQL能访问的VAS。为避免缓存池无限扩展最终会吃掉所有的VAS而导致SQL Server意外死掉,SQL Server会让缓存池留下一部分VAS内存作为“保留区”。另外SQLOS内存管理器还保证缓存池可以满足其他SQL Server内部组件需要:缓存池中的内存页可以用来缓存连接数据、SQL优化器数据、还要做最重要的执行缓存之用。因为分配给这些组件的内存是不能再用作存储数据了,因此这些页又叫做被盗用页(stolen pages)。

前面提到的资源监视器(resource monitor)属于SQLOS的一个组件。资源监视器的工作之一就是检查和监听操作系统发出的低内存通知,当资源监视器检测到低内存情况时,它会将这一情况记录到一个称为环缓冲区(Ring Buffer)的结构中,然后再将这个信息广播给SQL Server引擎,这样所有SQL相关的组件接到广播之后能减少它们的内存使用。SQLOS的内存管理器(Memory Manager)组件也同样会监视可用的虚拟内存和物理内存以及通过一个叫内存专员(memory clerk)的通知机制对内存压力做出响应。

在涉及到任务执行(查询编译、执行等等)的时候,SQLOS使用到一个叫做调度器的机制。调度器(scheduler)可以看成是SQL Server对于每个单个CPU的抽象表示,举个例子来说,一个运行SQL Server的机器有2颗4核的CPU的话那就能看到8个调度器。每个调度器都会和一定数量的工作线程(worker thread)相关联。例如在数据库上面执行的一个查询任务,这个任务会被分割成解析、编译、生成执行计划等一序列的子任务,每个这样的子任务都会由不同的线程来执行。

当SQL Server启动的时候,只会启动有限数量的线程。线程的总数取决于运行SQL Server的机器的CPU数量以及架构(x86还是x64)。一个少于4个CPU的x86系统,所创建的线程数量为256;超过4个CPU之后每个增加的CPU会多创建8个线程。对于少于4个CPU的x64系统,初始线程数量为512;超过4个CPU之后每个增加的CPU会多创建16个线程。也就是说机器的CPU越强大,SQL Server创建的线程就会越多。

当用户连接到SQL Server系统执行任务时,每个任务都会被分配给一个调度器。在SQL Server 2005之前,任务是按照轮流的方式分配的。自SQL Server 2005开始,任务分配则由SQLOS执行:任务会分配给最闲的调度器。

和Oracle一样,在SQL Server也是可以查看那些运行中的后台进程的。只要在数据库实例上执行sp_who2命令就可以看到那些后台运行的进程了。

当中的CHECKPOINT进程看名字就知道什么意思了。LOG WRITER进程等价于Oracle的LGWR进程:它负责将数据库的变化写到事务日志中。LAZY WRITER进程等价于Oracle的DBWn进程:它的任务是将数据页的更改从缓存池中写入到数据文件中。有一点和Oracle不同的时候,在这里只有一个lazy writer进程负责写数据文件。其它还有一些后台进程是和SQLOS关联的:scheduler monitor,deadlock monitor和resource monitor等等。

6.3. 事务一致性(Transactional Consistency)和基于时间点的恢复(Point-in-time Recovery)

Microsoft SQL Server和Oracle一样内置都有针对于事务的保护机制。事务一致性的基本思想就是对于数据的更改不会马上反映到磁盘的文件当中,实际上这两者更新的都是被称为数据缓冲区(buffer cache)的内存区,同时还在一个称为日志缓存(log buffer)的内存中连续的记录对于数据所做的更改,这些内存区域的内容被不断的写入到磁盘文件当中。用于将数据缓存区和日志缓存区中的内容写入到磁盘文件当中的进程是两个不同的进程,不过将日志缓存的写入磁盘要比将数据缓冲写入磁盘要频繁的多了。

现在当用户成功的提交一个事务时,他所做的更改并不会马上写入到数据文件中。不过这些变更会被记录到日志缓冲中,同时在发送提交成功的信息给用户之前这些相应的日志缓存数据会被写入到磁盘文件当中。

正如之前所述,SQL Server将日志文件称为事务日志(Transaction Log),Oracle则称为重做日志(Redo Log)。在SQL Server术语中,保存数据更改记录的内存块称为日志缓存(Log Buffer),Oracle则称为重做缓存(Redo Buffer)。抛开命名的差异,实际日志文件的作用却是一样的:在服务器意外宕机之后,数据库服务器会在服务重新启动之后检查文件的内容,如果在日志文件中发现已提交的事务而在数据文件中不存在时,这些已提交的事务就会被重新应用到数据文件中;如果日志文件中的记录显示事务没有完成或者是回滚了,那反映到数据文件中的变化也同样会回滚。在这个过程中的第一个部分称为重做(REDO),第二个部分称为撤销(译注:这里英文为undo,也许说回滚合适些)。

SQL Server为每个数据库单独的维护了一份事务日志,一份数据库事务日志可以存在有多个事务日志文件。事务日志文件在数据库创建的同时创建,之后也可以继续追加。对Oracle来说,数据库指的是素有的物理文件和逻辑的表空间。Oracle的重做日志会记录对于所有表空间的更改。一个Oracle数据库至少需要2个日志文件才能正常操作,当然日志文件可以多余2个,但是决不能少于2个。

SQL Server事务日志和Oracle重做日志之间的一个重大的区别就在于事务日志没有逻辑分组一说,而重做日志则可以被分组在2个或更多个日志分组当中。每个Oracle数据库至少需要有2个日志分组,每个分组里面必须要有一个或多个日志文件,日志组中的日志文件被称为日志组成员(member)。

Oracle每次都是将日志缓存中的重做日志一次写入到一个重做日志组中的所有文件中。在一个日志组中使用多个日志文件的容错技术称为多路技术(multiplexing)。在一个日志组写满之后,Oracle就会转到下一个日志组,这样的操作称为日志切换(log switching),在这个日志组满了之后又再转到下一个日志组,以此