2013-11-25 136 views
2

行碎片始終是您在爲表列選擇char/varchar2數據類型時需要考慮的事情,因爲Oracle會嘗試將新數據放入打開的空閒空間中,因此可能會開始碎片化,從而在表上發出批量刪除/插入/更新在某個時間放慢表現。現在,隨着閃存存儲磁盤的發展,所有內容都發生了變化,因爲由於閃存技術本身的原因,數據的寫入儘可能分散。如果我們不需要關心碎片,那麼它會破壞關於表格數據存儲問題和數據碎片的整體理解。有沒有人有將數據庫文件存儲在閃存存儲磁盤上的經驗?碎片問題是否隨ssd磁盤一起消失?使用閃存存儲時,我們是否仍然需要擔心行碎片?

回答

4

沒有像描述它的「行碎片」這樣的事情,而且實際上,它決不應該驅動您選擇的數據類型charvarchar2。您選擇的數據類型應該取決於數據的性質以及它是否真的是固定寬度或可變寬度。 99.9%的時間,你應該更喜歡varchar2

Oracle可以讀取或寫入的最小單元是塊。一個塊通常是8k(儘管它可以小到2k或32k大)。一個塊通常會存儲多行數據。由於Oracle每次都必須編寫整個塊,因此它是否必須在塊內移動數據並不重要。

在一個塊中,Oracle爲未來的增長保留了一定的空間。這由表格的PCTFREE設置控制。如果您預計行數會隨着時間的推移而大幅增加,那麼您可以使用大型的PCTFREE。如果您希望隨着時間的推移您的行的大小將保持不變,那麼您可以使用小型的PCTFREE。您不希望調整數據類型以防止行的大小發生變化,您希望調整表的PCTFREE以適合您所期望的任何更改。

如果Oracle的特定行的塊的空間不足(例如,如果行需要增長並且設置的太小),Oracle需要將該行遷移到新塊。這意味着它會在指向新塊的原始塊中留下指針,並將實際數據移動到新塊中。這可能會導致性能問題,因爲如果您正在從索引讀取數據,您必須訪問舊數據塊和新數據塊才能讀取該行,具體取決於表中行的哪一部分被遷移。如果行數大於塊數或行數超過255列的行,強制Oracle執行額外的I/O,但這些數據似乎並不是您關心的內容,那麼您也可以獲得鏈式行的問題。

不管存儲系統如何,您都希望適當地設置表格的PCTFREE,這樣可以最大限度地減少發生的行遷移量(還有其他方法可以最大限度地減少某些轉角情況下的行遷移,但是99%的時候你真的只是想正確設置PCTFREE)。針對您要存儲的數據使用適當的數據類型,不要擔心行遷移會影響您選擇的數據類型。

+0

我猜自動段存儲管理(ASSM)自動管理PCTFREE,所以在使用舊型MSSM存儲類型時需要設置PCTFREE嗎? – Centurion

+1

@Centurion - No. ASSM自動處理手動段空間管理中由'PCTUSED'參數處理的內容。這兩種類型的表空間都依賴於表的「PCTFREE」設置。自動管理'PCTFREE'是非常困難的,因爲系統無法知道行的大​​小如何隨時間變化 - 這只是數據建模者最初知道的。 –

相關問題