在同一列上查找具有多个索引的表

ado*_*lot 2 postgresql index metadata

我在搭建 PostgreSQL 数据库时遇到问题,因为 npgsql 不能很好地处理同一列上有两个索引的表。这是我在 github 上的项目的链接

我正在尝试查找这些索引/表,以便可以将它们从脚手架命令中排除。

例子:

CREATE TABLE public.altreproc (
  apcod integer NOT NULL,
  aptip character(3),
  apcam character(3),
  CONSTRAINT altreproc_pkey PRIMARY KEY (apcod)
);

CREATE INDEX ialtreproc1
  ON public.altreproc
  USING btree
  (aptip COLLATE pg_catalog."default");

CREATE INDEX ialtreproc2
  ON public.altreproc
  USING btree
  (apcam COLLATE pg_catalog."default");

CREATE INDEX ialtreproc3
  ON public.altreproc
  USING btree
  (aptip COLLATE pg_catalog."default" DESC);
Run Code Online (Sandbox Code Playgroud)

我的问题是当一个表有 2 个不同的索引与相同的列(一个ASC和一个DESC)时;我试图在我试图搭建的数据库中查询这样的表/索引。

我的目标是找到在同一列上包含多个索引的表。

Erw*_*ter 6

此查询检索在相同(以相同顺序排列的)表列上构建的索引的完整列表:

SELECT indrelid::regclass::text AS table
     , idx_columns
     , indexrelid::regclass::text AS index
FROM   pg_index i
     , LATERAL (
   SELECT string_agg(attname, ', ') AS idx_columns
   FROM   pg_attribute
   WHERE  attrelid = i.indrelid
   AND    attnum  = ANY(i.indkey)  -- 0 excluded by: indexprs IS NULL
   ) a
WHERE  EXISTS (
   SELECT FROM pg_index
   WHERE  indrelid = i.indrelid
   AND    indkey = i.indkey
   AND    indexrelid <> i.indexrelid  -- exclude self
   )
AND    indexprs IS NULL -- exclude expression indexes
ORDER  BY 1, 2, 3;
Run Code Online (Sandbox Code Playgroud)

pg_index.indkey是数据类型int2vector并包含,引用手册

一个indnatts值数组,指示此索引索引哪些表列。例如,值1 3表示第一个和第三个表列构成索引键。

因此,此列上的匹配以相同的顺序断言相同的列。
排序顺序、运算符类、排序规则或任何其他装饰器都可能不同。

约束:

  • 多列索引仅在所有索引列以相同顺序匹配时才符合条件。
  • 包含除普通表列之外的任何表达式的索引被排除在外。

旁白:ialtreproc3您示例中的索引是死运费,您应该将其删除。Postgres 可以以几乎相同的速度在两个方向上扫描索引。例外:具有混合排序顺序的多列索引。看:

虽然唯一的区别是排序顺序,但在同一列上维护多个 btree 索引是没有意义的。