相关疑难解决方法(0)

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
查看次数

索引最大行大小错误

array列有上限吗?

插入数组字段时出现此错误 -

PG::Error: ERROR:  index row size 3480 exceeds maximum 2712 for index "ix_data"
Run Code Online (Sandbox Code Playgroud)

这是我的表定义 -

create table test_array(id varchar(50), data text[]);

ALTER TABLE test_array ADD PRIMARY KEY (id);

CREATE INDEX ix_data ON test_array USING GIN (data);
Run Code Online (Sandbox Code Playgroud)

我需要数组字段的索引,因为我正在对它进行一些查找。

postgresql performance index database-design postgresql-9.1

15
推荐指数
3
解决办法
2万
查看次数

使用 INCLUDE 相对于在 INDEX 中添加列来覆盖索引的优势

Postgres 文档声明了以下有关仅索引扫描和覆盖索引的内容

如果您经常运行类似的查询

SELECT y FROM tab WHERE x = 'key';

加速此类查询的传统方法是仅在 x 上创建索引。然而,索引定义为

CREATE INDEX tab_x_y ON tab(x) INCLUDE (y);

可以将这些查询作为仅索引扫描来处理,因为可以从索引中获取 y 而无需访问堆。

因为列 y 不是索引搜索键的一部分,所以它不必是索引可以处理的数据类型;它仅存储在索引中,并且不被索引机制解释。另外,如果索引是唯一索引,即

CREATE UNIQUE INDEX tab_x_y ON tab(x) INCLUDE (y);

唯一性条件仅适用于 x 列,不适用于 x 和 y 的组合。(INCLUDE 子句也可以用 UNIQUE 和 PRIMARY KEY 约束编写,为设置这样的索引提供替代语法。)

问题1:如果 的数据类型y可以添加到索引中,并且没有唯一性要求,那么使用CREATE INDEX tab_x_y ON tab(x) INCLUDE (y)overCREATE INDEX tab_x_y ON tab(x, y)进行查询有什么优势SELECT y FROM tab WHERE x = 'key';

在向索引添加非键有效负载列(尤其是宽列)时保持保守是明智的做法。如果索引元组超过索引类型允许的最大大小,数据插入将失败。在任何情况下,非键列都会复制索引表中的数据并使索引的大小膨胀,从而可能会减慢搜索速度。 …

postgresql index covering-index

6
推荐指数
2
解决办法
4398
查看次数

字符可变索引开销和长度限制

我对字符变化列有一个独特的限制,该列的长度通常约为 600,但可以达到 1000 万。

我已经阅读了B-Trees,但我无法确定索引将消耗多少磁盘空间,或者如此大的值是否会阻止索引高效运行。

具有如此大长度的字符变化列对 B 树索引的磁盘空间和时间有何影响?

postgresql performance index disk-space btree

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