2010-11-01 13:07:28 来源:http://database.ctocio.com.cn
在Oracle数据库中为了更好的管理大容量的数据,专门开发了一些对应的大对象数据类型。具体的来说,有如下几种:
一是BLOB数据类型。它是用来存储可变长度的二进制数据。由于其存储的是通用的二进制数据,为此在数据库之间或者在客户端与服务器之间进行传输的时候,不需要进行字符集的转换。为此其传输的效率比较高,而不容易出现乱码现象。
二是CLOB数据类型。他主要是用来存储可变长度的字符型数据,也就是其他数据库中提到的文本型数据类型。虽然说VARCHAR2数据类型也可以用来存储可变长度的字符型数据,但是其容量是非常有限的。而现在这个CLOB数据类型,其可以存储的最大数据量是4GB。而且在定义这个数据类型的时候,不需要指定最大长度。在定义Varchar2数据类型时需要指定。
三是NCLOB数据类型。这个数据类型跟CLOB数据类型相似,也是用来存储字符类型的数据,不过其存储的是Unicode字符集的字符数据。同样,在这个数据类型中,也可以存储多达4GB容量的数量,而且在定义数据类型时不需要指定长度,数据库会自动根据存储的内容来进行调节。
四是BFILE数据类型。看看名字就知道跟其他的LOB数据类型不同。其是在数据库外面存储的可变二进制数据,其最多也可以存储4GB的数据。这里需要注意的是,在不同的操作系统上其存储的数据容量可能是不同的。这个数据类型的特殊在于其在数据库之外存储实际数据。也就是说,跟其他大对象数据类型不同,其数据并不是存储在数据文件中,而是独立于数据文件而存在的。在这个字段中,其只存储了指针信息。
二、不需要为大对象数据类型指定长度。
以上提到的一些大对象数据类型有一个特点,即全部都是可变长度的数据类型,而且在定义时不需要指定其最大的长度。虽然在数据库内建数据类型中也有一些可变长度的数据类型,但是,其往往需要在定义时指定最大的长度。实际存储数据时不能够超过这个长度。不过这些大容量数据类型则没有这个限制,只要在存储时不要超过其最大4GB的容量限制即可。由于其都是可变长度的数据类型,为此其实际存储的空间为根据数据容量的大小而改变。即如果某个数据大小只有1GB,那么其实际在硬盘中存储的空间就只有1GB,而不会是4GB。这就是可变长度数据类型的特征。像其他的一些不可变长数据类型,如果存储的数据容量不够的话,会以空格填充。不过现在这个大对象数据类型由于是可变长度的数据类型,其实际存储的长度会根据世纪数据来进行调整。为此可以最大限度的提高硬盘空间的使用率。
三、最好将大对象数据类型与普通数据类型分开存放。
在数据库设计时,如果某个表需要用到大容量数据类型,那么最好能够将这些大对象数据类型的列与其它列分成独立的表。如现在有一个产品信息表,在这个表中有一个大对象数据类型的数据,用来存储一段关于产品说明的视频资料。此时最好不要将这个列与产品信息表中的其他列存放在一起。最好是将这个大对象数据类型存放在另一张表中,然后通过产品ID关联起来。这对于提高数据库性能具有很大的帮助。如在对数据库进行备份时,由于对大容量的数据类型进行备份时需要花费比较长的时间,并会在很大程度上影响数据库的性能。而且这些大容量的数据类型一般更改也不会很频繁。所以在备份或者还原时,可以只对那些非存储大对象数据类型的表空间进行备份或者还原,从而提高数据库备份或者还原的性能。另外一种可行的方式是,不讲这些大对象信息保存在数据库中。如对于产品说明的视频资料,只是采用不同的可变字符长度数据类型,在表中存储其网络服务器上的路径。然后再客户端程序设计时,设计一个连接。用户点击这个连接就可以自动打开网络服务器上对应的文件。这无疑也会简化数据库的管理。所以,虽然说Oracle数据库提供了对大容量数据的管理能力,但是为了多方面考虑,还是能够采取独立管理为好,至少不要将其他的常规数据存放在同一个表或者同一个表空间中,以利于后续的管理与维护。
四、大对象数据类型在使用上的限制。
这些大对象数据类型不仅会影响Oracle数据库的性能,而且在使用上还有不少的限制。如在某些SQL子句中不能够使用这些数据类型。如where 是sql语句中最常用的条件语句,用来过滤数据。但是在这Where子句中,不能够使用大对象数据类型。即不能够根据大对象数据类型来过滤记录,及时这个大对象数据类型可能只是存储着少量的数据。故在采用大对象数据类型之前,需要了解这方面的限制。同理,还有一些子句也不支持这些大对象数据类型。如Order BY用来对某些记录进行排序,但是不能够根据大对对象数据类型对记录进行排序,如使用Order BY CLOB语句,系统就会提醒错误信息。同理,也不能够使用Group By子句对大对象数据类型的数据进行分组汇总。总之,虽然说Oracle数据库中已经专门为大容量数据类型提供了管理的渠道,但是支持其的语句还是比较少的。为此在定义大对象数据类型时,要注意以后数据操作上的烦恼。
另外如果数据库管理员习惯采用SQL*PLUS来设计数据库以及维护数据的时候,也需要注意了。数据库管理员是不能够在sql *plus这个工具上进行查询,显示大对象数据类型的数据。也不能够采用INSERT语句插入大对象类型的数据。如果硬要这么操作的话,则数据库系统会提示“列或者属性无法通过PLUS来显示”的错误信息。所以不仅在查询、排序上会有问题,对大对象数据类型进行数据插入等操作也会遇到阻碍。故虽然Oracle数据库提供了对大对象数据类型的支持,不过笔者不是很赞成用户将什么数据都往数据库系统中存存放,特别是一些视频资料。笔者在数据库部署中,总是告诫用户,能够独立管理这些大对象数据最好进行独立管理,不要放在数据库系统中。如可以将他们放在网络上的共享服务器中,然后通过一个地址来链接这些图片或者视频文件。如果设计的比较周到的话,在客户端界面上设置一个超链接即可。通过这个超链接在需要的时候可以直接打开这个文件。毕竟并不是每次用户查询某个产品信息时都需要用到这个视频说明文件。所以这还可以提高应用程序的性能。因为其默认情况下不会去打开这个大容量的文件。只有在需要时用户才会通过超链接来打开。这显然可以提高应用程序的性能,缩短用户的等待时间。
为此笔者建议,一般情况下只有这些大容量数据类型有同步显示的需要,如查看某个产品信息时,自动在窗口中显示这个产品的图片。在这种情况下才将大对象的数据类型保存在数据库中。除非用这个同步显示的需要,否则的话最好不要将其存放在数据库中。不然的话,对数据库性能、后续维护有害无利。所以Oracle提供的这些大对象数据类型只是用来应急的,而不能够作为常规功能来对待。
免责声明:本网站(http://www.ciotimes.com/)内容主要来自原创、合作媒体供稿和第三方投稿,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证有关资料的准确性及可靠性,读者在使用前请进一步核实,并对任何自主决定的行为负责。本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。