AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 306259
Accepted
ITChap
ITChap
Asked: 2022-01-20 01:16:57 +0800 CST2022-01-20 01:16:57 +0800 CST 2022-01-20 01:16:57 +0800 CST

Como descartar todos os índices não usados ​​para chaves primárias ou restrições

  • 772

Eu tenho um conjunto de dados antigo com muitos índices não utilizados. Eu gostaria de limpá-lo e trazê-lo de volta ao que parecia antes da adição de índices personalizados.

Existe uma maneira de descartar todos os índices, exceto os obrigatórios (como chaves primárias, restrições exclusivas etc.)?

postgresql index
  • 2 2 respostas
  • 362 Views

2 respostas

  • Voted
  1. Best Answer
    Erwin Brandstetter
    2022-01-20T05:52:06+08:002022-01-20T05:52:06+08:00

    Para obter uma lista:

    SELECT n.nspname AS schema, i.indrelid::regclass::text AS tbl, cl.relname AS idx, pg_get_indexdef(i.indexrelid)
         , 'DROP INDEX ' || i.indexrelid::regclass AS drop_cmd
    FROM   pg_index           i
    JOIN   pg_class           cl ON cl.oid = i.indexrelid
    JOIN   pg_namespace       n  ON n.oid = cl.relnamespace
    LEFT   JOIN pg_constraint co ON co.conindid = i.indexrelid
    WHERE  n.nspname <> 'information_schema'  -- ignore system schemas
    AND    n.nspname NOT LIKE 'pg\_%'         -- ignore system schemas
    AND    co.conindid IS NULL   -- no connected constraint
    AND    NOT i.indisprimary    -- not PK
    AND    NOT i.indisunique     -- not UNIQUE
    AND    NOT i.indisexclusion  -- not EXCLUDE
    AND    NOT i.indisclustered  -- not clustered
    AND    NOT i.indisreplident  -- not replicated
    ORDER  BY 1, 2, 3;
    

    db<>fique aqui

    Isso funciona para o Postgres 14 . Versões futuras podem divergir.

    Isso lista todos os índices que não são implementados por uma restrição ( PRIMARY, UNIQUE, EXCLUDE) - verificado novamente com um LEFT JOINto pg_constraintpara descartar qualquer conexão com qualquer restrição.
    Além disso, o índice não é usado para CLUSTERa tabela, nem para replicação.

    Mais detalhes no manual sobre pg_index .

    Inspecione o resultado. Pode haver qualquer número de índices úteis entre os demais. Como colunas com FOREIGN KEYrestrições de saída, onde um índice é opcional, mas frequentemente recomendado...
    Tem certeza? (Tem certeza que você tem certeza?)

    Você pode soltar um por um ou usar este comando gerado para soltá-los todos de uma vez:

    SELECT 'DROP INDEX ' || string_agg(i.indexrelid::regclass::text, ', ' ORDER  BY n.nspname, i.indrelid::regclass::text, cl.relname) AS drop_cmd
    FROM   pg_index i
    JOIN   pg_class cl ON cl.oid = i.indexrelid
    JOIN   pg_namespace n ON n.oid = cl.relnamespace
    LEFT   JOIN pg_constraint co ON co.conindid = i.indexrelid
    WHERE  n.nspname <> 'information_schema'
    AND    n.nspname NOT LIKE 'pg\_%'
    AND    co.conindid IS NULL  --  no connected constraint
    AND    NOT i.indisprimary
    AND    NOT i.indisunique
    AND    NOT i.indisexclusion
    AND    NOT i.indisclustered
    AND    NOT i.indisreplident;
    

    Se houver conexões simultâneas com o banco de dados, não use este comando-monstro, pois ele bloqueará todo o banco de dados, possivelmente por um longo período de tempo. E pode facilmente travar.

    • 2
  2. Laurenz Albe
    2022-01-20T08:02:00+08:002022-01-20T08:02:00+08:00

    Aqui está minha versão de uma consulta para encontrar todos os índices não utilizados:

    SELECT s.schemaname,
           s.relname AS tablename,
           s.indexrelname AS indexname,
           pg_relation_size(s.indexrelid) AS index_size
    FROM pg_catalog.pg_stat_user_indexes s
       JOIN pg_catalog.pg_index i ON s.indexrelid = i.indexrelid
    WHERE s.idx_scan = 0      -- has never been scanned
      AND 0 <>ALL (i.indkey)  -- no index column is an expression
      AND NOT i.indisunique   -- is not a UNIQUE index
      AND NOT EXISTS          -- does not enforce a constraint
             (SELECT 1 FROM pg_catalog.pg_constraint c
              WHERE c.conindid = s.indexrelid)
    ORDER BY pg_relation_size(s.indexrelid) DESC;
    
    • 1

relate perguntas

  • Quanto "Padding" coloco em meus índices?

  • Sequências Biológicas do UniProt no PostgreSQL

  • O que significa "índice" em RDBMSs? [fechado]

  • Como criar um índice condicional no MySQL?

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve