PostgreSQL 分区和索引

PostgreSQL partitioning and indexing

我是 PostgreSQL(版本 9)分区的新手,我需要一些建议。我有一套 A 国零件和另一套 B 国零件。每套大约有 200 万条记录。我需要将这两个集合加载到数据库中。每套都需要每周更新一次。通过更新集合,我的意思是清除集合的所有数据并从文件中重新加载它。集合应该独立更新,所以当清除集合 A 的数据时,我不能清除集合 B 的数据。我知道当我将每个集合存储在一个单独的分区中时,我可以独立截断每个分区,这比删除记录快得多。所以我决定这样做(table 'part' 中有更多列,但它们对这个问题并不重要):

CREATE TABLE part (
  country            CHAR(3) NOT NULL,
  manufacturer_code  CHAR(2) NOT NULL,
  part_code          CHAR(4) NOT NULL,
  part_description   VARCHAR(100)
);

CREATE TABLE part_cze (
  CHECK (country = 'CZE')
) INHERITS (part);

CREATE INDEX idx__part_cze ON part_cze (part_code, manufacturer_code);

CREATE TABLE part_svk (
  CHECK (country = 'SVK')
) INHERITS (part);

CREATE INDEX idx__part_svk ON part_svk (part_code, manufacturer_code);

应用程序查询 table 'part' 以获取数据。查询可能如下所示:

SELECT * FROM part WHERE country='CZE' AND part_code='4578' AND manufacturer_code='22'

我的问题:

  1. 以上方案是否正确,或者您会推荐其他方案吗?
  2. 我需要 table partpart_cze 上的索引吗?如果我理解得很好,Postgres 从具有索引的 table part_cze 获取数据,因此 table part 不需要它。
  3. 索引 idx__part_cze 是否应该包含国家列,或者数据按国家/地区分隔到分区是否足够?
  4. 如果我在 table 上创建索引 part 它应该包含列 country 吗?
  1. 看起来不错,只是您没有定义主键,但这不是 postgres 的要求。

  2. 'part' 上不需要索引,只要 table 中没有大量数据即可。

  3. 国家不应该在索引中 postgres 将 select 正确 table 基于检查约束。将国家/地区放入索引只会使索引更大,从而降低效率。

  4. 仅当您将大量数据放入该部分时才创建索引 table。然后根据 table 中的查询和实际数据,将国家/地区放入索引可能会或可能不会有帮助。