Postgres在集群数据上查找表

时间:2016-10-14 12:23:11

标签: database postgresql

背景

这是我管理的 postgres 数据库的简化版本:

TableA: id,name
TableB: id,id_a,prop1,prop2

这个数据库有一个特点:当我选择数据时,我只考虑具有相同TableB的{​​{1}}行。所以我从不想从TableB中选择混合值为id_a的数据。因此,查询总是这样:

id_a

前段时间,SELECT something FROM TableB INNER JOIN TableA ON TableA.id=id_a 中的行数增加到TableA行,20000行增加到TableB行。

对于第一次加速查询,我向10^7属性添加了二叉树查找表。如下所示:

TableB

问题

现在我必须插入新数据,数据库大小将变为更多,而不是当前大小的两倍。将数据插入 "my_index" btree (prop1) 变得太慢了。

我知道TableB更新的缓慢 当我添加my_index.的新行时,数据库必须重新排序TableB,查找表。

如果my_index未超过所有元素,我觉得这会加快速度。

但我不需要新行,并且给定的my_index属性要使用具有不同id_a属性的行进行排序

问题

如何在表上创建索引,当元素具有相同的公共属性(例如名为id_a的列)时,的元素?

1 个答案:

答案 0 :(得分:0)

你不能。

我会立即问您是否需要这样的索引的问题是:是的,但对于 id_a值,您想要索引吗?你的回答将是“为所有人”。

如果您实际上只想要某些值的索引,则可以使用partial index

CREATE INDEX partidx ON tableb(prop1) WHERE id_a = 42;

但实际上你想要整个表的索引。

此外,除非插入的行不满足索引的INSERT条件,否则WHERE也会一样慢。

您可以采取三项措施加快INSERT

  1. 在单个交易中尽可能多地运行INSERT个语句,最好是所有这些语句。

    然后,您不必在每{{}}}之后支付COMMIT的费用,INSERT非常昂贵:require data to be written to the disk hardware缓存),这非常慢(1毫秒是一个不错的时间)。

    如果您使用prepared statements,则可以加快速度。这样,COMMIT每次都不需要进行解析和准备。

  2. 使用SQL命令COPY插入许多行。 INSERT专为批量数据导入而设计,速度将快于COPY

  3. 如果INSERT要慢,通常是因为你需要COPY大量数据,最重要的方法是删除所有索引,用INSERT插入数据,然后重新创建索引。它可以将进程加速一个数量级,但当然,在删除索引时,数据库并不完全可用。