本帖最後由 donglin243870 於 2015-7-15 21:10 編輯 問題背景: LOB字段是Oracle數據庫用於存儲大數據對象的字段類型,包括BLOB、CLOB、NLOB、BFILE; 當LOB字段大小超過4k時,數據庫會單獨爲該LOB字段分配額外的BLOB Segments存儲BLOB對象,存儲在lobsegment中的lob缺省不在緩衝區緩存,對於lob的讀寫都是物理IO,代價很是高,因此對於大於4kb的lob字段更新效率很是低; 被刪除或更新的BLOB字段所佔用空間不會自動批量回收,當所在表有大量的刪除、更新操做時,BLOB所在Segments會迅速耗盡空間,新的INSERT須要空間時,會在高水位線上加鎖後,回收曾使用但已通過期的BLOB空間,因爲該操做效率很低,此時數據庫就會有大量的‘enq:HW – contention’等待,相關SQL會因爲該等待而串行執行,業務受影響十分嚴重。所以LOB字段不適合在有大批量刪除、更新操做的併發場合使用;oracle 已知解決辦法:性能 爲避免因爲LOB該特性形成的的風險,對LOB字段的使用應遵循以下要求:大數據 1.存儲在lobsegment中的lob能夠在定義的時候指定使用cache(默認是nocache),這對於中等大小的lob(好比幾k~幾十k)頗有效果,減小物理IOui 2. 有大批量刪除、更新操做,並且有併發插入的表中,建議不要使用LOB字段,好比日誌表。可使用多個varchar(4000)字段進行拼接來代替;spa 3. 使用LOB字段時,爲LOB字段手工單獨指定和表所在表空間不一樣的表空間; 4. 版本11g使用LOB字段時,建議使用Securefile(默認basefile),若是單條記錄顯著大於block size,使用compress選項。 5. 將數據存儲到文件系統中,數據庫字段中存儲文件地址,這種方法好像和bfile差很少; 問題: 1. 對於大容量不常常更新的lob除採用上面的解決辦法外,還有什麼好的方法; 2. 對於大容量的超過4000字節的文本,若是須要常常更新(如:發表文章,帖子後須要修改),採用什麼解決方案比較好; 3. 單個字段大容量信息存儲你們有些什麼好的方法; |