相关疑难解决方法(0)

我应该为 VARCHAR 列添加任意长度限制吗?

根据PostgreSQL 的文档VARCHAR,VARCHAR(n)和之间没有性能差异TEXT

我应该为名称地址列添加任意长度限制吗?

编辑:不是欺骗:

我知道这种CHAR类型是过去的遗物,我不仅对性能感兴趣,而且对其他优缺点感兴趣,例如 Erwin 在他惊人的回答中所述。

postgresql performance datatypes varchar

55
推荐指数
2
解决办法
5万
查看次数

当所有值都是 36 个字符时,使用 char 和 varchar 进行索引查找会明显更快吗

我有一个旧模式(免责声明!),它使用基于哈希生成的 id 作为所有表的主键(有很多)。这种 id 的一个例子是:

922475bb-ad93-43ee-9487-d2671b886479
Run Code Online (Sandbox Code Playgroud)

改变这种方法是不可能的,但是索引访问的性能很差。撇开这可能的无数原因不谈,我注意到有一件事似乎不太理想 - 尽管所有许多表中的所有 id 值的长度都正好是 36 个字符,但列类型是varchar(36)而不是 char(36)

将列类型更改为固定长度是否会char(36)提供任何显着的索引性能优势,除了每个索引页的条目数量增加很小等之外?

即在处理固定长度类型时 postgres 的执行速度是否比处理可变长度类型快得多?

请不要提及微小的存储节省 - 与对列进行更改所需的手术相比,这无关紧要。

postgresql performance index varchar

38
推荐指数
1
解决办法
1万
查看次数

varchar(n) 的开销是多少?

我想从Postgres 文档中询问这个片段关于varchar(n)类型的含义:

短字符串(最多 126 个字节)的存储要求是 1 个字节加上实际字符串,其中包括字符情况下的空格填充。较长的字符串有 4 个字节的开销而不是 1 个字节。

假设我有一个varchar(255)字段。现在,以下声明:

  • 如果该字段包含 10 个字节的字符串,则开销为 1 个字节。因此该字符串将使用 11 个字节。
  • 如果该字段使用 140 个字节保存字符串,则开销为 4 个字节。因此该字符串将使用 144 个字节。

上面的那些说法是真的吗?这里有人理解文档相同的方式,我不过这里有人指出的开销总是4个字节在这里

postgresql varchar database-internals

19
推荐指数
1
解决办法
9984
查看次数

PostgreSQL 中的一字节“char”类型究竟是如何工作的?

我经常看到人们谈论"char"。我从来没有用过它。它在文档中定义为,

“char”类型(注意引号)与 char(1) 的不同之处在于它只使用一个字节的存储空间。它在系统目录中作为一种简单的枚举类型在内部使用。

并进一步,

"char"  1 byte  single-byte internal type
Run Code Online (Sandbox Code Playgroud)

那么,如果它是一个字节,那么域是什么,您将如何使用它?它是签名的还是未签名的?在@Erwin Brandstetter 的这篇文章中,他对此进行了阐述,但我仍然感到困惑。他正在使用ascii()and chr(),并提供了这个

SELECT i
     , chr(i)::"char"        AS i_encoded
     , ascii(chr(i)::"char") AS i_decoded
FROM   generate_series(1,256) i;
Run Code Online (Sandbox Code Playgroud)

这在 10 点到 11 点之间做一些非常奇怪的事情。

  i  | i_encoded | i_decoded 
-----+-----------+-----------
...
   8 | \x08      |         8
   9 |           |         9
  10 |          +|        10
     |           |           -- WTF is going on here.
  11 | \x0B      |        11
  12 | \x0C      |        12 …
Run Code Online (Sandbox Code Playgroud)

postgresql datatypes storage cast

9
推荐指数
1
解决办法
1998
查看次数

当 varchar 效率更高时,为什么数据库具有 char 数据类型?

据我所知的基本区别CHARVARCHAR数据类型,它CHAR占用的固定长度,而VARCHAR占用空间基于正被存储的内容。

但是如果VARCHAR根据存储的内容动态处理空间管理如此有效,为什么数据库支持CHAR数据类型,所有CHAR(n)字段都可以是VARCHAR(n)字段,对吧?

datatypes storage sql-standard

3
推荐指数
1
解决办法
331
查看次数

Postgres 如何在磁盘上存储许多 varchars?

我有一张有 2 亿行的 80 场演出的桌子。我正在尝试加快速度,我注意到它有大量的 varchar 列。在模式中,它们的长度范围从 15 个字符到 250 个字符,大多数设置为 50。所有 varchars 的总长度为 850 个字节。在实际使用中,很多字段为空或者字符串很短。

我知道 Postgres 使用 8k 页面大小。现在,如果我必须进行全表扫描并假设最坏的情况,每页 8k / 850 = 9.6 条记录。浏览我的完整表格将(并且确实)需要很长时间。然而实际上,由于这些字段中的大多数都是空的,那么磁盘上将为这些 varchar 分配多少空间?每页是否会有更多记录,或者 Postgres 是否会添加一些填充以方便以后更新?

我问的原因是因为我正在探索通过将尽可能多的不常访问的 varchars 列从该表中踢出并进入我们将通过联接访问的另一个列来提高性能的想法。

感谢您对我的逻辑的任何确认或否认。

postgresql

1
推荐指数
1
解决办法
108
查看次数