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
)时;我试图在我试图搭建的数据库中查询这样的表/索引。
我的目标是找到在同一列上包含多个索引的表。
此查询检索在相同(以相同顺序排列的)表列上构建的索引的完整列表:
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 索引是没有意义的。