2015-08-09 61 views
0

我讀一個關於Postgres線協議文檔,並將它描述了一個數據分組的結構,如下所示:32位消息長度= 1GB查詢?

enter image description here

它然後接着說

一個32位的消息長度如下 - 這意味着你不能將查詢發送 這是大於1 GB

可能有人解釋了爲什麼一個32位的消息長度是指查詢長度不能大於1GB?

這是因爲一個32位整數的最大數值可能是20億,這意味着20億個字符大概是1GB?正如你所看到的,我很不清楚這是如何計算的。

+3

〜20億字節將是2GB,所以沒有任何意義。它可能是一個錯字嗎?否則他們錯過了部分解釋,因爲結論並不是從前提出發的。 – harold

回答

1

我不認爲這是正確的,而解釋當然不是。

2^32字節是4GiB,或者如果您僅使用有符號整數的正半數2GiB(2^31)。 1GiB是2^30,即僅使用32位整數的30位。

PostgreSQL's maximum field size is 1GiB,但這是由於如何表示可變長度字段的細節。

我並不認爲這意味着查詢限於1 GiB。特別是,使用單獨的Parse/Bind/Execute,分別處理參數,並且每個參數如此有限時,我都看不到整個查詢應該是。

在32位機器上,PostgreSQL用於獲得僅2GiB的地址空間,或在某些操作系統上獲得3 GiB。幾個Linux變種允許4個GiB,但這種情況並不常見。鑑於它必須將查詢讀入內存,解析它,處理字符串或字節轉義等,通常會在內存中創建多個輸入數據副本。即使主機有更多的RAM,也會迅速耗盡可用地址空間,並導致內存不足錯誤。因此,在32位機器的實踐中,字段大小限制遠低於1 GiB,最大查詢大小限制也是如此。

字段大小限制爲1 GiB不是2或4的原因是格式struct varlena(請參見src/include/c.h)。大小字段的第一個字節的一位被保留以指示它是1字節還是4字節大小的標題。這讓PostgreSQL更加緊湊地存儲了大多數常見的小變長字段。第二位表示它是存儲壓縮還是未壓縮。請參閱「varlena頭的位佈局」src/include/postgres.h中查看詳細信息。

這不適用於查詢大小,而AFAIK PostgreSQL從不將查詢文本存儲爲struct varlenaDatum。所以真正的限制可能是2GB,但需要仔細閱讀協議代碼才能確認。

顯示尺寸被表示爲簽署 32位整數(通過struct StringInfoData),從而限制了任何消息以2^31位,2個吉布。如果存在這樣的限制,我不會立即看到什麼將其限制爲1 GiB。

儘管如此,我強烈建議不要發送大於1 GiB的協議消息,因爲這是記錄的限制。