Sendo acostumado (e potencialmente estragado) pelo MSSQL, estou pensando em como posso obter o tamanho das tabelas no Oracle 10g. Eu pesquisei no Google e agora estou ciente de que talvez não tenha uma opção tão fácil quanto sp_spaceused. Ainda assim, as respostas em potencial que recebi estão desatualizadas na maioria das vezes ou não funcionam. Provavelmente porque não sou DBA no esquema com o qual estou trabalhando.
Alguém teria soluções e / ou recomendações?
Respostas:
Você pode estar interessado nesta consulta. Ele informa quanto espaço é alocado para cada tabela, levando em consideração os índices e quaisquer LOBs na tabela. Muitas vezes, você está interessado em saber "quanto espaço a tabela de pedidos ocupa, incluindo quaisquer índices", em vez de apenas a própria tabela. Você sempre pode se aprofundar nos detalhes. Observe que isso requer acesso às visualizações DBA_ *.
fonte
fonte
null
(num_rows
,avg_row_len
), você precisa fazer algumas análises antes através da seguinte declaraçãoANALYZE TABLE your_table COMPUTE STATISTICS
Primeiro, eu geralmente advertiria que reunir estatísticas da tabela para fazer a análise de espaço é uma coisa potencialmente perigosa a se fazer. A coleta de estatísticas pode alterar os planos de consulta, principalmente se o DBA configurou um trabalho de coleta de estatísticas que usa parâmetros não padrão que sua chamada não está usando e fará com que o Oracle analise novamente as consultas que utilizam a tabela em questão, o que pode ser um desempenho. acertar. Se o DBA deixou intencionalmente algumas tabelas sem estatísticas (comum se você
OPTIMIZER_MODE
escolher ESCOLHER), a coleta de estatísticas pode fazer com que o Oracle pare de usar o otimizador baseado em regras e comece a usar o otimizador baseado em custos para um conjunto de consultas que podem ser um desempenho importante dor de cabeça se for feito inesperadamente na produção. Se suas estatísticas forem precisas, você pode consultarUSER_TABLES
(ouALL_TABLES
ouDBA_TABLES
) diretamente sem ligarGATHER_TABLE_STATS
. Se suas estatísticas não forem precisas, provavelmente existe uma razão para isso e você não deseja perturbar o status quo.Segundo, o equivalente mais próximo ao
sp_spaceused
procedimento do SQL Server é provavelmente oDBMS_SPACE
pacote da Oracle . Tom Kyte possui um bomshow_space
procedimento que fornece uma interface simples para este pacote e imprime informações semelhantes às que sãosp_spaceused
impressas.fonte
Primeiro, reúna estatísticas do otimizador na tabela (se você ainda não o tiver):
AVISO: Como Justin diz em sua resposta, a coleta de estatísticas do otimizador afeta a otimização de consultas e não deve ser feita sem o devido cuidado e consideração !
Em seguida, encontre o número de blocos ocupados pela tabela nas estatísticas geradas:
O número total de blocos alocados à tabela é de blocos + blocos vazios + num_freelist_blocks.
blocks é o número de blocos que realmente contêm dados.
Multiplique o número de blocos pelo tamanho do bloco em uso (geralmente 8 KB) para obter o espaço consumido - por exemplo, 17 blocos x 8 KB = 136 KB.
Para fazer isso para todas as tabelas em um esquema de uma vez:
Nota: Alterações feitas acima, depois de ler este tópico do AskTom
fonte
Modifiquei a consulta da WW para fornecer informações mais detalhadas:
fonte
Para tabelas e índices sub-particionados, podemos usar a seguinte consulta
fonte
IIRC as tabelas necessárias são DBA_TABLES, DBA_EXTENTS ou DBA_SEGMENTS e DBA_DATA_FILES. Também existem versões USER_ e ALL_ para tabelas que você pode ver se não possui permissões de administração na máquina.
fonte
Aqui está uma variante da resposta dos WWs, inclui partições e sub-partições, conforme sugerido anteriormente, além de uma coluna para mostrar o TIPO: Tabela / Índice / LOB, etc.
fonte
fonte
Modifiquei a consulta para obter o tamanho do esquema por espaço de tabela.
fonte
Depende do que você quer dizer com "tamanho da tabela". Uma tabela não está relacionada a um arquivo específico no sistema de arquivos. Uma tabela residirá em um espaço de tabela (possivelmente vários espaços de tabela, se estiver particionado, e possivelmente vários espaços de tabela, se você também quiser levar em consideração os índices na tabela). Um espaço de tabela geralmente possui várias tabelas e pode se espalhar por vários arquivos.
Se você estiver estimando quanto espaço precisará para o crescimento futuro da tabela, então avg_row_len multiplicado pelo número de linhas da tabela (ou número de linhas que você espera da tabela) será um bom guia. Porém, a Oracle deixará algum espaço livre em cada bloco, em parte para permitir que as linhas 'cresçam' se forem atualizadas, em parte porque talvez não seja possível ajustar outra linha inteira nesse bloco (por exemplo, um bloco de 8K caberia apenas 2 linhas de 3K, embora esse seja um exemplo extremo, pois 3K é muito maior que a maioria dos tamanhos de linha). Portanto, BLOCKS (em USER_TABLES) pode ser um guia melhor.
Mas se você tivesse 200.000 linhas em uma tabela, excluiu metade delas, a tabela ainda 'possuirá' o mesmo número de blocos. Não os libera para outras tabelas usarem. Além disso, os blocos não são adicionados a uma tabela individualmente, mas em grupos chamados de 'extensão'. Portanto, geralmente haverá EMPTY_BLOCKS (também em USER_TABLES) em uma tabela.
fonte
Correção para tabelas particionadas:
fonte
Seleção simples que retorna os tamanhos brutos das tabelas, com base no tamanho do bloco, também inclui tamanho com índice
selecione table_name, (nvl ((selecione a soma (blocos) de dba_indexes a, dba_segments b em que a.index_name = b.segment_name e a.table_name = dba_tables.table_name), 0) + blocos) * 8192/1024 TotalSize, blocos * 8 tableSize de dba_tables encomende até 3
fonte
Achei isso um pouco mais preciso:
fonte
fonte
há mais uma opção que permite obter o tamanho "selecionar" com junções e o tamanho da tabela como opção também
fonte
Eu tenho a mesma variante dos últimos que calcula segmentos de dados de tabela, índices de tabela e campos de blob:
Fonte .
fonte