2種大小敏感型數據庫的節省空間技術

4 月 30

Raima徽標在灰色的背景上

您可以對DDL進行以下兩個簡單但不明顯的更改,以減小數據庫文件的大小。關於RDM內部的一些有趣的解釋說明了它為什麼起作用,並允許您在所有數據庫設計中做出更好的DDL決策。

考慮以下SQL DDL:

創建數據庫EventTrace
創建圓表TraceTab(
     deviceId smallint,
     低點實數,
     maxLevel雙倍
)maxrows = 8000

該行的磁盤上(或內存中)大小為32個字節。看起來應該是14個字節,其中2個用於smallint,4個用於實數,8個用於雙精度。多餘的18個字節從何而來?如果您的數據庫對大小敏感,那麼最好在此DBMS內部學習一小節課。

RDM中的每一行/記錄都有一個標頭,該標頭由記錄類型(2個字節)和它自己的數據庫地址(8個字節)組成。在標題之後,行數據以C對齊的佈局顯示。這意味著,在大多數編譯器上,每個元素都將對齊,以使其位於N字節邊界上,其中N是元素的大小。也就是說,一個8字節的double將從一個8字節的邊界開始,即4 on 4和2 on2。為上述DDL定義的結構必須在smallint和real之間進行填充,並在real和the之間進行填充。兩倍,每行花費2 + 4 = 6個填充字節。

第一種技術:按大小從大到小排列列/字段定義。

我們的默認“數據庫地址”(指向記錄槽的內部指針)為8個字節(如上所述),一個文件中最多允許281萬億行。您可以覆蓋默認值,並使用4字節的數據庫地址,該地址最多允許1670萬條記錄,通常綽綽有餘。為此,請在數據庫名稱後說“ dba4”。現在,標頭是6個字節而不是10個字節,並且每行還保存了4個字節。標頭在DBMS中很重要,因為它可用於一致性/損壞檢查。

第二種方法:當您知道任何一張表中的行數不會超過1670萬時,請使用“ dba4”。

僅供參考,每行有一個額外的字節用於存儲NULL標誌,每列一位。如果列數超過8,將使用第二個字節,依此類推。

現在,DDL如下所示:

創建數據庫EventTrace dba4
創建圓表TraceTab(
     maxLevel雙倍,
     低點實數,
     deviceId smallint
)maxrows = 8000


因此,我們重新定義但等效的行的總長度為:

2記錄類型
4數據庫地址
8第一欄(maxLevel)
4秒欄(lowPoint)
2第三列(deviceId)
1個空列位

每行21個總字節

進一步的FYI –當將行放入固定長度的頁槽中時,它們總是進入偶數地址。這大大減少了運行時庫所需的memcpy操作數。因此,該行的大小為22個字節,其中46個將適合一個1024字節的頁面。

以上所有內容均適用於非SQL數據庫定義,但有一個例外–沒有NULL標誌字節。 DDL的語法當然不同,但是含義相同。

Get notified about new RDM updates

Be the first to know about new Raima Database Manager updates when they go live, use cases, industry trends and more.