设置ActiveRecord的文本限制是否可以节省硬盘空间?

时间:2014-07-03 12:33:00

标签: ruby-on-rails ruby postgresql activerecord

@pozs ... 这与您指定的内容不重复。那是我看的第一个地方。我不太关心text和varchar之间的区别。我在询问中型服务器硬盘中使用的物理空间。

我知道硬盘驱动器被拆分为字节块,也就是块,如果使用的块少于块的总量,则剩余空间是空闲的未使用空间。我很好奇的是文本选项本身使用了一定数量的存储空间。可以减少使用的空间而不仅仅是限制输入的数量。我可以说文字限制=> 1,它仍然可以使用成千上万的字节......这就是我所要求的。

这是硬盘块的照片。这就是我想象的ActiveRecord文本类型空间的使用方式


Hard Drive Blocks in chunks of 4K


这里是块上的维基(数据存储)http://en.wikipedia.org/wiki/Block_(data_storage)正如您所见,他们说"块存储通常由文件系统或数据库管理系统(DBMS)抽象" 他们不说的是它是如何抽象的。

根据Igor的博客,他说&#34;令我惊讶的是,他们确定我们的Postgres数据库的平均I / O大小远高于8KB块大小,高达1MB < /strong>." http://igorsf.wordpress.com/2010/11/01/things-to-check-when-configuring-new-postgres-storage-for-high-performance-and-availability/虽然这有助于了解它并没有告诉我ActiveRecord和PostgreSQL在处理块时的默认行为。

根据concernedoftunbridgewells&#34;数据库将在某个给定块大小的表或索引中分配空间。在Postgres的情况下,这是8K&#34;。 https://dba.stackexchange.com/questions/15510/understanding-block-sizes/15514#15514?newreg=fc10593601be479b8ed697d1bbd108ed因此,如果将8K用作块,那么我将文本类型限制设置为多少或多低以匹配并适合一个8K块,因为它可能只使用一个块。

我知道可以更改PostgreSQL块大小设置。所以我希望明确&#34; ActiveRecord PostgreSQL块大小处理当前是如何工作的&#34;。我会接受一个很好的答案。

2 个答案:

答案 0 :(得分:1)

页面包含多个项目(假设显然有空间)。如果你的行少于8k,那么其他行将与它一起存储在同一页面上(我稍微简化了一下 - 无论如何,postgres分别存储大列)。限制列的最大长度不会与此相互作用。

我对character types的详细信息是,126个字符以下的字符串会产生3个字节的开销,但这种情况会逐行发生,与最大长度无关。

postgresql文档详细介绍了on disk format以及postgresql如何处理large columns

答案 1 :(得分:0)

IMO,文本类型db列占用的大小主要取决于列中的内容存储。 ActiveRecord中的限制设置只会在内容保存到db列之前进行验证,并且不会对实际存储产生影响。