Postgresql 如何从postgres数据库中删除所有索引表?

Postgresql 如何从postgres数据库中删除所有索引表?,postgresql,postgresql-9.3,Postgresql,Postgresql 9.3,我的数据库中有很多索引表。我想删除它们,只索引那些非常大的表。如何删除它们 我能行 select relname from pg_class where relkind='i'; and drop index 但是我认为这个查询也会删除一些系统表。如何在不影响数据库功能的情况下执行此操作?如果使用pg_类查找所有索引,则需要将其连接到pg_命名空间并在存储表(和索引)的架构上进行筛选 但更容易的是: select schemaname, indexname, t

我的数据库中有很多索引表。我想删除它们,只索引那些非常大的表。如何删除它们

我能行

select relname from pg_class where relkind='i'; and drop index

但是我认为这个查询也会删除一些系统表。如何在不影响数据库功能的情况下执行此操作?

如果使用
pg_类
查找所有索引,则需要将其连接到
pg_命名空间
并在存储表(和索引)的架构上进行筛选

但更容易的是:

select schemaname, 
       indexname, 
       tablename, 
       format('drop index %I.%I;', schemaname, indexname) as drop_statement
from pg_indexes
where schemaname not in ('pg_catalog', 'pg_toast');
不过,这也将显示用于主键的索引

如果要排除主键索引,可以使用以下方法:

select s.nspname as schemaname,
       i.relname as indexname,
       t.relname as tablename,
       format('drop index %I.%I;', s.nspname, i.relname) as drop_statement
from pg_index idx
  join pg_class i on i.oid = idx.indexrelid
  join pg_class t on t.oid = idx.indrelid
  join pg_namespace s on i.relnamespace = s.oid
where s.nspname  not in ('pg_catalog', 'pg_toast')
  and not idx.indisprimary;

如果还想排除唯一索引,只需将
而不是idx.indexunique
添加到
where
条件。

如果要使用
pg_类
查找所有索引,则需要将其连接到
pg_名称空间
并在存储表(和索引)的架构上进行筛选

但更容易的是:

select schemaname, 
       indexname, 
       tablename, 
       format('drop index %I.%I;', schemaname, indexname) as drop_statement
from pg_indexes
where schemaname not in ('pg_catalog', 'pg_toast');
不过,这也将显示用于主键的索引

如果要排除主键索引,可以使用以下方法:

select s.nspname as schemaname,
       i.relname as indexname,
       t.relname as tablename,
       format('drop index %I.%I;', s.nspname, i.relname) as drop_statement
from pg_index idx
  join pg_class i on i.oid = idx.indexrelid
  join pg_class t on t.oid = idx.indrelid
  join pg_namespace s on i.relnamespace = s.oid
where s.nspname  not in ('pg_catalog', 'pg_toast')
  and not idx.indisprimary;

如果您还想排除唯一索引,只需将
而不是idx.indexunique
添加到
where
条件中。

删除表
删除表而不是索引。查询返回索引。我不清楚您到底想删除什么:任何有索引的表还是所有索引的表?“只索引那些小的表”这从根本上讲是向后的。您希望为大型表编制索引,以便对它们的查询更快。小桌子(几千行或更少)并不能从中受益匪浅;如果PostgreSQL估计额外磁盘读取的成本抵消了更快的搜索优势,它甚至会完全忽略这些数据。通过删除索引,你到底想做什么?@a_horse_,没有名字对不起。我把它改为删除索引。我想删除索引而不是表。@jpmc26对不起,我只想为非常大的表编制索引。做出了改变。我想删除索引,这样数据库的大小就会大大减少,数据库的备份也会更快。我想在另一台服务器上安装DB。@user2238284 PostgreSQL不包括转储文件中索引的磁盘内容:。删除索引不会加快转储速度。删除大索引可能会加快恢复速度,但您可能还是希望在另一台计算机上重新创建索引。您也可以将索引从还原中排除,而不是将它们放在源数据库中。
drop table
将删除一个表而不是索引。查询返回索引。我不清楚您到底想删除什么:任何有索引的表还是所有索引的表?“只索引那些小的表”这从根本上讲是向后的。您希望为大型表编制索引,以便对它们的查询更快。小桌子(几千行或更少)并不能从中受益匪浅;如果PostgreSQL估计额外磁盘读取的成本抵消了更快的搜索优势,它甚至会完全忽略这些数据。通过删除索引,你到底想做什么?@a_horse_,没有名字对不起。我把它改为删除索引。我想删除索引而不是表。@jpmc26对不起,我只想为非常大的表编制索引。做出了改变。我想删除索引,这样数据库的大小就会大大减少,数据库的备份也会更快。我想在另一台服务器上安装DB。@user2238284 PostgreSQL不包括转储文件中索引的磁盘内容:。删除索引不会加快转储速度。删除大索引可能会加快恢复速度,但您可能还是希望在另一台计算机上重新创建索引。您还可以将索引从还原中排除,而不是将它们放到源数据库中。