理解Oracle数据库

什么是 Oracle 数据库

Oracle数据库是甲骨文公司开发的一种关系型数据库管理系统,也就是RDBMS。Oracle RDBMS是一款十分优秀的关系型数据库产品,Oracle从头到尾都是一个RDBMS,是针对OLTP系统进行设计的,这一点从它底层的块结构就可以看出。Oracle在大并发量和海量数据关系型检索方面具有十分优越的性能,但是它并不擅长OLAP,因为它不支持列压缩存储(当然,从exadata开始,Oracle也能够支持混合列压缩,这是一种行存储和列压缩的混合模式,目前只在exadata数据库一体机上实现)。

与其他关系型数据库相比,Oracle在某些方面更为优秀,但也有其不足的地方,因此它绝对不是万能的。优势和劣势都是与生俱来的,这是由Oracle数据库的基本架构和数据存储的基础结构所决定的,优化只能解决局部性的问题,有限度地提升其性能,但是绝对无法完全掩盖结构性问题带来的负面影响。Oracle的优势在于大并发量下的高吞吐能力,因此很适合大型企业级应用。但是如果我们在一个并发量和数据量都不是很大的系统中,对Oracle和MSSQL Server进行比较,就不难发现Oracle并没有多大的优势,甚至在某些方面还不如后者。

再往更为本质的方面去探讨,Oracle是一个RDBMS系统,也是一款应用软件。Oracle数据库除了将数据存储于文件中外,还通过一个被称为实例的后台机制向外提供服务。Oracle RDBMS系统,它必须依赖于某个操作系统或硬件体系。和我们自己编写的程序一样,Oracle必须适应于某个操作系统,并充分利用操作系统提供的资源,反过来,操作系统也必须能够将资源提供给Oracle数据库使用。在一个仅仅运行Oracle RDBMS的系统上,操作系统应该被调整为能够将绝大多数的资源都提供给Oracle数据库。这样,Oracle的进程就能够最大可能地得到足够的系统资源。

但是Oracle不是一个简单的程序,而是十分复杂的体系。首先,Oracle需要将数据存储在数据文件中,为了能够支持大量的并发用户访问数据库,并且提高数据库的访问性能,Oracle需要引入共享内存,从而实现资源的共享。比如,针对SQL引擎,每个SQL最终将会被解析为一系列的执行步骤,这就是我们常说的执行计划。如果同一个SQL执行多次,每次都要重新生成执行计划,那么效率就比较低下了,Oracle引入了共享池来实现这方面的共享。同样,如果一个数据块每次读取都要访问文件,那么效率就不高了,于是Oracle引入了DB Cache来缓存这些数据。同一个数据块可能被多个用户修改,如果每次修改就要直接存盘,那么效率也会降低,于是Oracle设计了DBWR进程,来专门负责将数据块写入文件。这似乎很复杂,不过这一切对于架构师来说很好理解。架构设计的目的就是有效地将功能划分成不同的组成部分,然后让这些部分能够很好地协同工作,从而达到最好的效果,因此架构师很容易做出类似的设计。

Oracle不仅是特殊的应用程序,更是庞大的数据库管理系统,它包含了一个RDBMS管理系统和其他一系列应用程序。Oracle的核心——RDBMS管理系统包含在$ORACLE_HOME/bin/oracle映像、$ORACLE_HOME/lib/libclntsh.so等中,而sqlplus、exp等则是一些Oracle数据库的工具。tnslsnr是Oracle的网络连接部件,用于连接客户端到RDBMS。这些应用程序都被安装在ORACLE HOME目录下。

数据库是独立的,从物理结构上看,它是由一系列文件组成的,包括参数文件、口令文件、控制文件、数据文件、日志文件等。一套完整的数据库,只要其所有的文件都是完整的,那么即使数据库的RDBMS管理系统遭到破坏,只要重新安装和数据库版本一致的RDBMS管理系统,该数据库就可以重新启用。其实所谓重新启用,本质上就是可以在某个实例中打开这个数据库,供客户使用。

另外,由于Oracle是行存储的RDBMS数据库,这一特点也使其十分适合OLTP应用。从Oracle数据库的内部数据结构可以看出,Oracle在行存储数据方面下足了功夫,甚至连行锁都是设置在行头中的。在行锁的性能方面,Oracle的表现极为优秀,这一点毋庸置疑。不过这种设计,可能不适合一些经常以列为访问对象的OLAP系统,列压缩技术才是实现这类应用的最佳解决方案。因此如果有人宣称,Oracle数据库在OLAP分析方面的性能高于SYBASE IQ,那一定不可信。

原文地址:https://www.sunansheng.com/blog/20180601/what-oracle.html