您可以對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的語法當然不同,但是含義相同。