Postgresql 有哪些可用选项可以识别和删除Postgres中的无效对象(例如:损坏的索引)

Postgresql 有哪些可用选项可以识别和删除Postgres中的无效对象(例如:损坏的索引),postgresql,Postgresql,识别和删除Postgres中无效对象的可用选项有哪些您是否尝试过以超级用户身份运行vacuum full pg_class 此外,自动吸尘器最终应该会处理好它。您的对象似乎是临时表/索引,并且目录(通常)没有数据更新得那么频繁。如果您指的是检测“无效”(创建不良)索引,显然Postgres在尝试创建索引时可能会“失败”,然后查询规划器将不会使用它们,尽管它们存在于您的系统中。此查询将检测“失败”索引: 虽然我认为检测TOAST表索引不会有什么坏处,所以您可以删除查询的这一部分:) 相关的,对我

识别和删除Postgres中无效对象的可用选项有哪些

您是否尝试过以超级用户身份运行
vacuum full pg_class


此外,自动吸尘器最终应该会处理好它。您的对象似乎是临时表/索引,并且目录(通常)没有数据更新得那么频繁。

如果您指的是检测“无效”(创建不良)索引,显然Postgres在尝试创建索引时可能会“失败”,然后查询规划器将不会使用它们,尽管它们存在于您的系统中。此查询将检测“失败”索引:

虽然我认为检测TOAST表索引不会有什么坏处,所以您可以删除查询的这一部分:)


相关的,对我来说,有时仅仅在表上运行一个新的分析也会使索引突然开始在生产中使用(即,即使索引不是“无效的”,它们也可能在分析运行之前未被使用)。奇怪。

你说的“无效对象”是什么意思?你能说得更具体一点吗?我不知道你说的“无效对象”是什么意思。您是指修复断开的序列、删除断开的索引、清除与字符串格式不匹配的数据吗?我已经确定了几个似乎是“孤立”的索引(磁盘上有相应文件的pg_类条目)。例如,pg_类有一个名为“history_setID_temp_index”的索引的以下行:“history_setID_temp_index”;16598;0;10;403;345289902;0;0;0;0;0;FF“我”;1.0;0;0;0;0;FFFF0;"";“”我们在磁盘上有文件345289902、345289902.1、345289902.2…,最多345289902.15(总计接近16GB),但删除了索引mci。“history_setID_temp_index”返回错误:索引345289902的缓存查找失败我如何删除此索引和相应的磁盘文件,并确定是否需要一个只给出无效索引列表的简单查询:
从pg_类中选择pg_class.relname,其中pg_index.individ=false和pg_index.indexrelid=pg_class.oid
SELECT n.nspname, c.relname
FROM   pg_catalog.pg_class c, pg_catalog.pg_namespace n,
       pg_catalog.pg_index i
WHERE  (i.indisvalid = false OR i.indisready = false) AND
       i.indexrelid = c.oid AND c.relnamespace = n.oid AND
       n.nspname != 'pg_catalog' AND
       n.nspname != 'information_schema' AND
       n.nspname != 'pg_toast'