Null

Firebird:表和空數據

  • February 22, 2018

我正在使用 Firebird 數據庫。我有一張有數千行的大桌子。每行定期記錄許多對象的對象狀態。我只需要為一個對象註冊新屬性。我想我有兩種可能:

  1. 即使我有很多空值,也將新列添加到表中
  2. 創建一個包含我感興趣的唯一屬性的表並將其適當地綁定到第一個

哪種解決方案最適合不損失性能?

向表中添加新列不會修改現有數據。數據庫中的記錄在寫入記錄時使用所謂的格式版本進行版本控制。此格式版本描述了列(以及其他與列相關的元數據)。

如果您更改表以添加列,則會添加新的格式版本。讀取記錄時,Firebird 將使用原始格式版本讀取行,然後 - 在記憶體中 - 將行“升級”到最新的格式版本,例如添加具有空值(或預設值)的新列,刪除列已被刪除,或更改大小等。

換句話說,添加列很便宜。NOT NULL有一個例外:從 Firebird 3 開始,如果存在現有記錄,則添加帶有 -constraint 的列將需要預設值,否則添加失敗。在早期版本中,這將默默地添加一個NOT NULL包含NULL現有記錄的列,將這些行的數據修復留給數據庫所有者。

關於儲存本身,Firebird 使用一種簡單的 RLE 壓縮形式來壓縮磁碟上的記錄。因此,使用新格式版本寫入的 Null 值確實會佔用一些空間,但對於大多數類型,最多 2 個字節,對於超過 127 個字節的列類型,最多為 2 個字節的倍數。作為一種極端的優化形式,將通常放在一起的列分組可能是有意義的NULL(但性能優勢可能非常小)。

關於執行時性能,由於 Firebird 3(並假設客戶端支持有線協議 13 或更高版本),NULL有線協議中跳過的列(意味著沒有為該列發送數據),這減少了發送的字節數網路。

引用自:https://dba.stackexchange.com/questions/198260