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

问题描述 投票:0回答:1

我有下表:

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 中)使用相同的磁盘空间创建一个只有一个索引的表?

postgresql indexing storage
1个回答
0
投票

在 Postgres 中没有办法(重新)使用表(主要关系,“堆”)和索引存储中的相同数据。每个都单独存放。

但是这并不一定意味着...

每次查询都要从磁盘读取数据两次。

如果索引包含满足查询所需的所有列,则可以进行仅索引扫描

索引通常只有在需要读取的所有表行中不超过百分之几时才有用(并且实际使用)。 (虽然没有索引,但您必须全部阅读。)

索引通常(远)小于主要关系。对于初学者来说,索引元组头只占用 8 个字节,而表行占用 24 个字节。索引中通常只有一列或几列,而 Postgres 13 或更高版本可以

compress duplicated index entries。相关:

  • 为读取性能配置 PostgreSQL
  • 复合索引也适合查询第一个字段吗?
© www.soinside.com 2019 - 2024. All rights reserved.