查询表的索引相关信息,有多种不同的方式可以适合不同场景的场景。
1.查询pg_class中索引的名称
select relname from pg_class where relkind='i' and relowner=...
我们可以根据owner查询,根据relowner是一个oid,比较通用的方式是使用子查询
relowner=(select oid from pg_roles where rolname='test');
这样来查询test用户的索引名称。不过我们也可以使用oid的别名类型(regclass、regtype、regproc、regrole、regnamespace)这样将会很方便。
oid的别名类型也有两种使用形式,一种是直接使用别名类型,还有一种是使用函数(to_regclass、to_regnamespace、to_regrole),例如将test用户转为regrole类型:
postgres=> select 'test'::regrole;
regrole
---------
test
(1 row)
postgres=> select to_regrole('test');
to_regrole
------------
test
(1 row)
所以上面的查询语句我们可以改写为:
select relname
from pg_class
where relkind='i'
and relowner = 'test'::regrole;
或者是
select relname
from pg_class
where relkind='i'
and relowner = to_regrole('test');
第一种写法简便些,适用于psql或者脚本;第二种写法更标准。
2.查看单个对象上的索引信息
在psql客户端里可以使用元命令\d查看某个对象上的索引信息
postgres=> \d t1
Table "test.t1"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
id | integer | | |
Indexes:
"idx_t1" btree (id)
也可以打开ECHO_HIDDEN查看元命令执行的具体语句
postgres=> \set ECHO_HIDDEN on
3.查看所有的索引信息
在psql客户端里可以使用元命令\di查看索引信息列表
postgres=> \di
List of relations
Schema | Name | Type | Owner | Table
--------+------------+-------+-------+-------
public | idx_t1_pub | index | test | t1
test | idx_t1 | index | test | t1
test | idx_t2 | index | test | t2
test | idx_t3 | index | test | t3
test | pk_test | index | test | test
test | ui1 | index | test | t6
(6 rows)
4.查询pg_indexes系统视图
pg_indexes视图可以查看模式名称、表名称、索引定义等信息
postgres=> select schemaname,tablename,indexname,indexdef
postgres-> from pg_indexes
postgres-> where schemaname='test';
schemaname | tablename | indexname | indexdef
------------+-----------+------------+---------------------------------------------------------------------------------------------------------------------
test | test2 | uk_test2 | CREATE UNIQUE INDEX uk_test2 ON test.test2 USING btree (b, c)
test | t1 | idx_t1 | CREATE INDEX idx_t1 ON test.t1 USING btree (id)
test | t2 | idx_t2 | CREATE INDEX idx_t2 ON test.t2 USING btree (id)
test | t3 | idx_t3 | CREATE INDEX idx_t3 ON test.t3 USING btree (id)
test | t6 | ui1 | CREATE INDEX ui1 ON test.t6 USING btree (COALESCE(a, ''::character varying), COALESCE(b, ''::character varying), c)
(5 rows)
5.自定义视图查询
下面的查询视图根据可见性规则查询所有schema下的索引信息
CREATE OR REPLACE VIEW view_index AS
SELECT
n.nspname as "schema"
,t.relname as "table"
,c.relname as "index"
,pg_get_indexdef(indexrelid) as "def"
FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
JOIN pg_catalog.pg_index i ON i.indexrelid = c.oid
JOIN pg_catalog.pg_class t ON i.indrelid = t.oid
WHERE c.relkind = 'i'
and n.nspname not in ('pg_catalog', 'pg_toast')
and pg_catalog.pg_table_is_visible(c.oid)
ORDER BY
n.nspname,t.relname,c.relname;
然后查询view_index视图
postgres=> select * from view_index;
schema | table | index | def
--------+-------+------------+---------------------------------------------------------------------------------------------------------------------
public | t1 | idx_t1_pub | CREATE INDEX idx_t1_pub ON public.t1 USING btree (id)
test | t1 | idx_t1 | CREATE INDEX idx_t1 ON test.t1 USING btree (id)
test | t2 | idx_t2 | CREATE INDEX idx_t2 ON test.t2 USING btree (id)
test | t3 | idx_t3 | CREATE INDEX idx_t3 ON test.t3 USING btree (id)
test | t6 | ui1 | CREATE INDEX ui1 ON test.t6 USING btree (COALESCE(a, ''::character varying), COALESCE(b, ''::character varying), c)
test | test | pk_test | CREATE UNIQUE INDEX pk_test ON test.test USING btree (a, b)
(6 rows)
保持联系
从2019年12月开始写第一篇文章,分享的初心一直在坚持,本人现在组建了一个PG乐知乐享交流群,欢迎关注我文章的小伙伴加我微信进群吹牛唠嗑,交流技术,互赞文章。
最后修改时间:2022-12-06 11:25:09
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。