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 / 345321
Accepted
Chris Douglas
Chris Douglas
Asked: 2025-02-17 18:01:53 +0800 CST2025-02-17 18:01:53 +0800 CST 2025-02-17 18:01:53 +0800 CST

Adicionar coluna de contagem de linhas à consulta de tamanho de tabela

  • 772

Tenho o seguinte SQL que gera uma lista bem formatada dos tamanhos de todas as tabelas em um banco de dados:

SELECT
  schema_name,
  relname,
  pg_size_pretty(table_size) AS size
FROM (
       SELECT
         pg_catalog.pg_namespace.nspname           AS schema_name,
         relname,
         pg_relation_size(pg_catalog.pg_class.oid) AS table_size

       FROM pg_catalog.pg_class
         JOIN pg_catalog.pg_namespace ON relnamespace = pg_catalog.pg_namespace.oid
     ) t
WHERE schema_name NOT LIKE 'pg_%'
ORDER BY table_size DESC;

Isso gera dados como os seguintes (alguns nomes e tamanhos foram alterados para ocultar dados, mas você entendeu a ideia):

     schema_name     |                 relname                 |    size
---------------------+-----------------------------------------+------------
 information_schema  | log                                     | 1024 kB
 information_schema  | collations                              | 1024 kB
 information_schema  | routines                                | 1024 kB
(30 rows)

Gostaria de ter os resultados de count() em cada tabela adicionados como uma quarta coluna aqui, mas não consigo descobrir como fazer isso. Estou usando o PostgreSQL 14, se isso especificamente fizer alguma diferença.

postgresql
  • 1 1 respostas
  • 128 Views

1 respostas

  • Voted
  1. Best Answer
    Vérace
    2025-02-17T18:53:22+08:002025-02-17T18:53:22+08:00

    Você pode fazer isso (db<>fiddle aqui ):

    SELECT
      schema_name,
      relname,
      pg_size_pretty(table_size) AS size,
        
      estimate AS row_count_est     --   <<  Note!
    
    FROM (
           SELECT
             pg_catalog.pg_namespace.nspname        AS schema_name,
    
             pg_catalog.pg_class.reltuples::BIGINT  AS estimate,     --  <<   Note!
             
             relname,
             pg_relation_size(pg_catalog.pg_class.oid) AS table_size
    
           FROM pg_catalog.pg_class
             JOIN pg_catalog.pg_namespace ON relnamespace = pg_catalog.pg_namespace.oid
         ) t
    WHERE schema_name NOT LIKE 'pg_%'
    ORDER BY table_size DESC;
    

    Resultado (de db<>fiddle> - recortado para abreviar):

    schema_name          relname                   size        row_count_est
    information_schema   sql_features              64 kB       755
    information_schema   sql_sizing                8192 bytes  23
    information_schema   sql_implementation_info   8192 bytes  12
    information_schema   sql_parts                 8192 bytes  11
    information_schema   administrable_role_...    0 bytes     -1
    ...
    ...
    ...
    

    Observe o registro final com uma estimativa de -1 - isso significa que a tabela nunca foi analisada pelo sistema e, portanto, ele não sabe qual é a contagem e não quer fornecer nem mesmo uma estimativa.

    Você pode obter vários graus de precisão na resposta de Erwin Brandstetter aqui , mas esteja ciente de que respostas mais precisas exigem mais recursos do sistema para fornecer essa resposta - devido ao sistema MVCC do PostgreSQL, contagens precisas são mais difíceis do que com o MySQL, por exemplo, que usa um mecanismo diferente.

    A importância de ANALYZE-ing pode ser vista neste db<>fiddle onde a estimativa é -1 antes da análise e (o número correto) 100.000 depois - mostra o quão importante é que as estatísticas do sistema sejam mantidas atualizadas!

    • 4

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

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

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

  • 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