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