如何从PostgreSQL索引中选择数据?

10
如果我使用如下命令创建了一个索引:CREATE INDEX ixname ON tbname (id);
其中,ixname 是索引名称,tbname 是创建索引的表名,id 是索引所对应的列名。
现在,如果我想查看 ixname 中的内容,该怎么做呢?(我是基于索引是一个具有排序列的关系/表这一前提提出问题的)

1
你的问题不够清晰,参考的问题/答案也没有帮助。 - Gordon Linoff
所引用的答案并没有真正做到你认为它做到了什么。如果你想知道索引包含什么,看一下它的定义,并编写一个查询,从相关表中获取所需内容,如果你愿意的话。 - TZHX
5
答案很简单:你不需要这样做。你只需从表格里进行选择。如果有意义,Postgres将从索引中检索数据。 - user330315
你是想问如何检索存储在表tbname的列id中的数据,还是想问如何随后确定索引ixname的定义? - user359040
@MarkBannister 我想查看存储在索引中排序的数据,而不是从创建它的表或列中查看。 - Robert C. Holland
显示剩余4条评论
2个回答

29

你无法以客户端的方式,也不能使用SQL来访问索引中的数据。

索引中的数据是PostgreSQL内部的,对外部世界不可见。你可以审视你的索引定义(使用pg_indexes表或pg_get_indexdef函数),但你无法查看其中存储的实际内容。

好吧,你在技术上可以找到存储索引数据的文件(使用pg_class.relfilenode并检查base/子目录中的文件),并解码它们的b树(或其他索引)的二进制数据,但我不确定这是否是你想要做的。除非你打算学习或入侵PostgreSQL内部。


2
谢谢,这比评论者提供的信息更有帮助。 - Robert C. Holland
如果有人找到了如何查看索引内容的快速解决方案,我会非常感激! - Dmytro Zhluktenko

2

您可以使用 pg_filedump 工具来完成

步骤1. 在Debian中安装pg_filedump

$ git clone git://git.postgresql.org/git/pg_filedump.git
$ cd pg_filedump/
$ make
$ make install

# note the line /usr/bin/install -c  pg_filedump '/usr/lib/postgresql/17/bin'

# add env var
$ PATH=/usr/lib/postgresql/17/bin

# check that it works
$ pg_filedump -h

步骤二:通过SQL查找索引文件路径

SHOW data_directory;
-- /var/lib/postgresql/17/main

-- list your indices
SELECT *
FROM pg_indexes;

-- locate particular index
SELECT pg_relation_filepath('name_of_target_index');
-- let's say output is
-- base/123/4567

步骤三:查看索引文件

请查看索引文件。
$ cd /var/lib/postgresql/17/main/base/123/
$ pg_filedump -D int,varchar 4567

通过调整pg_filedump参数,可以获得漂亮的可视化效果。受https://blog.dbi-services.com/displaying-the-contents-of-a-postgresql-data-file-with-pg_filedump/启发。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接