postgresql 是否可以对表和索引使用相同的磁盘数据?

im9ewurl  于 2023-02-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(204)

我有下表:

CREATE TABLE my_table (
  table_a_id integer NOT NULL,
  table_b_id integer NOT NULL,
  table_c_id integer NOT NULL,
  data numeric(30, 0) NOT NULL
);

CREATE UNIQUE INDEX my_index ON my_table (table_a_id, table_b_id, table_c_id);

据我所知,磁盘空间似乎增加了一倍,因为每个索引行都有表(table_a_id, table_b_id, table_c_id)中三个字段的副本,加上指向表行的“项目标识符”。
这意味着每个查询必须从磁盘读取数据两次。
有没有一种方法(在PostgreSQL中)可以创建一个只有一个索引的表,并且两个索引使用相同的磁盘空间?

gv8xihay

gv8xihay1#

在Postgres中**没有办法从存储中(重新)使用相同的数据来存储表(主关系,“堆”)和索引。
但这并不意味着...
每个查询必须从磁盘读取数据两次。
如果索引包括满足查询所需的所有列,则Index-only scans是可能的。
索引通常只有在需要读取的表行不超过百分之几的情况下才有用(并且实际使用)(如果没有索引,则必须读取所有行)。
索引通常比主关系小得多。对于初学者来说,索引元组头只占8个字节,而表行占24个字节。索引中通常只有一列或几列,Postgres 13或更高版本可以压缩重复的索引条目。

相关问题