我有2个表格,下面的模式等于行数量。当我运行 SELECT relname, relpages FROM pg_class ORDER BY relpages DESC 命令,即使对于两个模式的数据类型(总字节总数)也会导致不同的大小,它们也显示为23GB。结合桌子来弄清楚我可以节省多少空间的最佳方法是什么?另外,是否有任何方法可以确定每行实际占用多少空间?

                                 Table "public.table1"
Column        |           Type           |                      Modifiers                      
--------------+--------------------------+-----------------------------------------------------

 field1       | smallint                 | 
 field2       | smallint                 | 
 field3       | integer                  | 
 field4       | smallint                 | 
 timestamp    | timestamp with time zone | 
 user_id      | integer                  | 
 status       | boolean                  | 
 id           | integer                  | not null default 

                                  Table "public.table2"
 Column          |           Type           |                     Modifiers                      
 ----------------+--------------------------+----------------------------------------------------
 user_id         | integer                  | 
 begin_timestamp | timestamp with time zone | 
 end_timestamp   | timestamp with time zone | 
 field           | smallint                 | not null
 id              | integer                  | not null default 
有帮助吗?

解决方案

对此的合理答案必须恕我直言(或至少暗示)问题:为什么桌子开始开头? (更重要的是:它仍然适用吗?)

一般情况:我不知道Postgres DB引擎如何工作的细节,但是保存的磁盘空间的下限可能不大于删除的列的大小 +重复变量的索引 +一点点管家数据

上限也很小,因此可能不值得麻烦。甚至可能是出于性能原因对它们进行了分区 - 因为某些列会更频繁地访问(阅读甚至更新),因此可以使其更小(较少的列)使其更快。 (以同时访问两者的列的一些罚款。)

具体情况: 看起来它们之间有很多冗余领域。例如,USER_ID不需要两次。开始/结束/X时间戳也许可以减少到两个或一。因此,根据应用程序的要求,可能会节省一些钱。同样,尝试弄清楚他们为什么这样做。

总的来说,我同意布莱恩·艾格(Bryan Agee)的观点。磁盘空间可能不应该是您对任何足够大的东西开始运行Postgres的关注。尤其是如果您在“修复”此处花费的时间获得报酬,则该成本可能会超过较大磁盘的成本。

每排空间: 我不太精通Postgres的细节,因此知道某人应该能够纠正任何错误。例如,有办法询问Postgres该特定行实际上占用多少空间;我不知道。我写的基本上是(我相信)今天通常完成的数据库存储背后的理论。

每个字段都有一点(在其本身的字节中或整个行中常见的斑点中),该字段表示该值是否为null。如果是无效的值,则没有更多的存储。然后有一个长度字节 - 除非这是固定宽度数据类型隐含的。然后是数据本身。

因此,一排一个INT(甚至64位)和三个无效值可能只需3个字节。 (对于值<127,存储尺寸= 1和字节。)加上索引和 其他各种家政元数据. 。同样,我不知道Postgres在这方面走了多远。这些因素全部倾向于使“这行占据多少”问题,这是一个无用的答案。

Afaik Postgres还使用“页面” - 空间块可能不会在整个边界上存储。因此,较大的记录可能最终可能会在页面中“不适合”,因此需要将其放置在另一个/新页面中。

其他提示

因为所得组合的表将有未使用的行以用于每个表中的记录,所以可能性是您不会获得空间,而是丢失空间。

更重要的是,由于磁盘空间的原因,我会高度劝阻该性质的架构决定。磁盘很便宜 - 设计精良,功能应用不是。如果存在运行时性能的问题(即所有46 GB都被加载到内存/交换空间中),则您可能会在手上有优化和调整问题。

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top