Oracle中Long和LOB的一点知识.
Oracle从8开始引入LOB类型,并宣称LOB类型具有比LONG/LONG RAW更多的优势,如:
a, 一个表中可以有多个LOB类型,一个表最多只能有一个LONG或LONG/RAW类型
b,含有LOB类型的表可以分区,含有LONG/LONG RAW的则不能.
c,LOB可以随机读写,而LONG/LONG RAW只能顺序读写.
d,LOB支持最多4GB的容量.
e,查询其他字段时可以读取更少的数据块而获得更好的性能.
1,LOB与LONG RAW的存贮对比
LOB和LONG/LONG RAW都可以用来以二进制主式存放图片或声音等文件,空间的浪费主要取决于LOB的存贮主式,是行外存放还是行内存放,以及DB_BLOCK_SIZE的大小.LOB采用CHUNK为单位来分析空间,最小的CHUNK就是一个数据库块,如果你的块大小是8K,采用行外存放时,不可能每一个CHUNK刚好被用完,如最后一个CHUNK中的大小是2k,则将会有6K的空间被浪费,再加上一个LOB LOCATOR的大小36字节;采用行内存放时,也会有LOB LOCATOR也要多花36字节.
2,变长字符集与CLOB的空间浪费
CLOB的存贮空间浪费与字符有关, CLOB有单独的字符集标记, 由于字符集有定长和不变长之分, 采用定长字符集时,CLOB的空间浪费和字符集无关,但采用变长字符集时,为了实现CLOB的随机访问特征,CLOB中的所有字符都转换为UCS2字符集(Unicode,固定2字节),从这也可以解释为什么LONG/LONG RAW支持2G,而LOB要支持4G,因为Oracle总得维护从LONG到CLOB升级的稳定性.在INLINE存贮时,如果你的内容全部是单字节的,那么浪费的空间是36+字节数,采用行外存贮时,也要多花36字节,并且需要一倍的空间.
3,LONG与CLOB的选择之我见
选择LONG与CLOB主要应当取决于空间的重要性,与否采用分区,和如何访问其中的内容,如果不需要做随机访问,不妨采用LONG类型, 其实有时分行存贮也是可以考虑的一种方法, LONG在空间利用上还是有一些问题的.