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 / 121976
Accepted
Gonzalo Vasquez
Gonzalo Vasquez
Asked: 2015-11-25 07:07:19 +0800 CST2015-11-25 07:07:19 +0800 CST 2015-11-25 07:07:19 +0800 CST

Descubra chaves estrangeiras e/ou índices ausentes

  • 772

Temos um banco de dados bastante grande (cerca de 700 GB de dados), que foi herdado para nós e teve vários DBAs. Com o tempo percebemos que faltam várias chaves estrangeiras e índices.

Gostaria de saber se existe alguma maneira automatizada de descobrir essas possíveis chaves/índices ausentes usando algum tipo de análise de log ou algo semelhante.

database-design postgresql
  • 2 2 respostas
  • 2259 Views

2 respostas

  • Voted
  1. Best Answer
    Károly Nagy
    2015-11-25T08:01:20+08:002015-11-25T08:01:20+08:00

    Lembrei-me de ter visto uma consulta há algum tempo em uma postagem, então uma pesquisa rápida resultou em:

    CREATE FUNCTION pg_temp.sortarray(int2[]) returns int2[] as '
      SELECT ARRAY(
          SELECT $1[i]
            FROM generate_series(array_lower($1, 1), array_upper($1, 1)) i
        ORDER BY 1
      )
    ' language sql;
    
      SELECT conrelid::regclass
             ,conname
             ,reltuples::bigint
        FROM pg_constraint
             JOIN pg_class ON (conrelid = pg_class.oid)
       WHERE contype = 'f'
             AND NOT EXISTS (
               SELECT 1
                 FROM pg_index
                WHERE indrelid = conrelid
                      AND pg_temp.sortarray(conkey) = pg_temp.sortarray(indkey)
             )
    ORDER BY reltuples DESC
    ;
    

    De http://mlawire.blogspot.nl/2009/08/postgresql-indexes-on-foreign-keys.html

    Isso lhe dará o que você quer.

    E também encontrei https://github.com/pgexperts/pgx_scripts/blob/master/indexes/fk_no_index.sql , mas não usei isso sozinho.

    • 5
  2. Ask613
    2018-10-06T07:56:18+08:002018-10-06T07:56:18+08:00

    Isso é difícil de fazer genericamente sem conhecer as convenções de nomenclatura.

    Supondo que todas as tabelas comecem com t_ e assumindo que as colunas de chave estrangeira terminem com _id , essa consulta (pelo menos) listará a maioria das chaves estrangeiras, tanto as ausentes quanto as presentes. Ele também irá sugerir o nome da tabela de destino.

    WITH source_data AS
    (
        SELECT table_name AS source_table_name, column_name AS source_column_name
        FROM information_schema.columns
        WHERE table_schema = 'public'
        AND table_name LIKE 't_%'
        AND column_name LIKE '%\_id'
    ), target_data AS
    (
        SELECT distinct table_name as target_table_name
        FROM information_schema.columns
        WHERE table_schema = 'public'
        AND table_name like 't_%'
    ), data_to_find AS
    (
        SELECT *, CASE WHEN target_table_name IS NULL THEN 'No Match' ELSE 'Match' END AS match_found
        FROM source_data
        LEFT JOIN target_data ON ('t_' || LEFT(source_column_name, -3)) = target_table_name
    ), foreign_keys AS
    (
        SELECT
            tc.constraint_name, tc.table_name, kcu.column_name, 
            ccu.table_name AS foreign_table_name,
            ccu.column_name AS foreign_column_name 
        FROM 
            information_schema.table_constraints AS tc 
            JOIN information_schema.key_column_usage AS kcu
              ON tc.constraint_name = kcu.constraint_name
            JOIN information_schema.constraint_column_usage AS ccu
              ON ccu.constraint_name = tc.constraint_name
        WHERE constraint_type = 'FOREIGN KEY'
    )
    SELECT CASE WHEN constraint_name IS NULL THEN 'No Foreign Key' ELSE 'Foreign Key Found' end AS foreign_key, * FROM data_to_find
    LEFT JOIN foreign_keys ON 
    (
        data_to_find.source_table_name = foreign_keys.table_name 
        AND
        data_to_find.source_column_name = foreign_keys.column_name
    )
    ORDER BY foreign_key, match_found, source_table_name, source_column_name
    
    • 2

relate perguntas

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Quais são algumas maneiras de implementar um relacionamento muitos-para-muitos em um data warehouse?

  • Sequências Biológicas do UniProt no PostgreSQL

  • 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