2011-04-15 29 views
4

我試圖做一些增長預測,我有一些表,我必須做一些計算我的行大小,我有多少行生成的一天,以及..數學。如何預測Oracle表的大小?

我正在計算我的表中每行的平均大小作爲每個字段的平均大小的總和。所以basicaly:

SELECT 'COL1' , avg(vsize(COL1)) FROM TABLE union 
SELECT 'COL2' , avg(vsize(COL2)) FROM TABLE 

琛說起來,通過每天的條目數相乘,並從那裏工作的預測。

實驗證明,對於一個表我看了產生的大小比我想象的還要和讓我想知道如果我的方法是正確的小了很多。

此外,我沒有考慮我的預測的索引大小 - 當然我應該。

我的問題是:

  1. 這是方法我使用可靠嗎?

  2. 關於如何處理索引預測的提示?

我已經完成了Google搜索,但是我發現的方法都是關於細分和擴展或基於整個表格的計算。我將需要與我的表的實際行進行預測(我必須分析表中的數據以便計算一天中有多少條記錄)。

最後,這是一個近似值。我知道我錯過了一些字節在這裏和那裏的開銷和東西。我只是想確保我唯一缺少的字節而不是千兆 :)

+0

另請參閱http://dba.stackexchange.com/questions/23147/estimate-a-database-size – Vadzim 2014-04-28 09:43:38

回答

5

1)你的方法是合理的計算行的平均大小。 (儘管請注意,如果您的列包含null,則應使用avg(nvl(vsize(col1), 0))而不是avg(vsize(COL1)))。但是,它沒有考慮行的物理排列。

首先,它沒有考慮到的頭信息(來自塊和行):你不能8K數據放入8K塊。有關更多信息,請參閱data block format上的文檔。

然後,行並不總是存儲整齊地打包。 Oracle允許每個塊中留出一些空間,以便行更新時可以增長(由pctfree參數管理)。同樣,當行被刪除時,空白空間不會立即回收(如果您沒有在本地管理的表空間中使用ASSM,則塊返回到可用塊列表所需的可用空間量取決於pctused)。

如果表中已經有一些具有代表性的數據,則可以通過比較物理使用的空間(收集統計信息後的all_tables.blocks*block_size)和平均行長度來估計需要的額外空間量。

順便說Oracle可以很容易地給你的平均行長度的一個很好的估計:收集表上的查詢和統計all_tables.avg_row_len

2)大多數情況下(讀取:除非存在錯誤或者屬於非典型使用的索引),索引將按比例增加到行數。

如果您有代表性數據,您可以通過將其實際大小乘以行數的相對增長,對其未來大小進行良好估計。

4

最後一次Oracle published their formulae for estimating the size of schema objects在Oracle 8.0中,這意味着鏈接文檔已過期十年。但是,我不期望Oracle在預留段頭,塊頭或行頭信息方面發生了很大的變化。

+0

空間使用估計準則也適用於新版本,例如, [[11.2管理員指南]](https://docs.oracle.com/cd/E11882_01/server.112/e25494/schema.htm#ADMIN11622)建議使用[DBMS_SPACE.CREATE_TABLE_COST](https://docs.oracle。 com/cd/E11882_01/appdev.112/e40758/d_space.htm#ARPLS68103),這可以免除您的一些手動計算。 – vilpan 2015-05-27 12:52:58