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 / 233718
Accepted
r0tt
r0tt
Asked: 2019-04-02 23:32:28 +0800 CST2019-04-02 23:32:28 +0800 CST 2019-04-02 23:32:28 +0800 CST

Corrigir linhas encadeadas do Oracle Database

  • 772

Um banco de dados Oracle 12c tem uma tabela com linhas encadeadas:

select 
   owner              c1, 
   table_name         c2, 
   pct_free           c3, 
   pct_used           c4, 
   avg_row_len        c5, 
   num_rows           c6, 
   chain_cnt          c7,
   chain_cnt/num_rows c8
from dba_tables
where
owner not in ('SYS','SYSTEM')
and
table_name not in
 (select table_name from dba_tab_columns
   where
 data_type in ('RAW','LONG RAW','CLOB','BLOB','NCLOB')
 )
and
chain_cnt > 0
order by chain_cnt desc
;
RESULT:
C1  C2  C3  C4  C5  C6  C7  C8
SCHEMA_XY   PERSON  10      662 98.930  85.872  1

Eu entendo que esta tabela tem 85,872% de linhas encadeadas. Eu tentei:

alter table SCHEMA_XY.PERSON move;

alter table SCHEMA_XY.PERSON move pctfre 30;

SELECT 'alter index '||OWNER||'.'||INDEX_NAME||' rebuild online ;'FROM DBA_INDEXES where TABLE_NAME='PERSON';

As Filas Encadeadas permanecem altas. A tabela tem 250 colunas principalmente varchar2 e number. Como posso corrigi-lo?

oracle oracle-12c
  • 3 3 respostas
  • 979 Views

3 respostas

  • Voted
  1. Best Answer
    Balazs Papp
    2019-04-03T02:32:42+08:002019-04-03T02:32:42+08:00

    Você tem muitas colunas e um comprimento médio de linha alto (662). Talvez você até tenha linhas maiores que o tamanho do bloco.

    Com filas longas, é inevitável ter filas encadeadas. Exemplo com tamanho de bloco de 8K:

    SQL>  create table t1(c1 char(2000 byte), c2 char(2000 byte), c3 char(2000 byte), c4 char(2000 byte), c5 char(2000 byte));
    
    Table created.
    
    SQL> insert into t1 select 'c1', 'c2', 'c3', 'c4', 'c5' from dual connect by level <= 10000;
    
    10000 rows created.
    
    SQL> commit;
    
    Commit complete.
    
    SQL>  exec dbms_stats.gather_table_stats(user, 'T1');
    
    PL/SQL procedure successfully completed.
    
    SQL> select chain_cnt from user_tables where table_name = 'T1';
    
     CHAIN_CNT
    ----------
             0
    
    SQL> analyze table t1 compute statistics;
    
    Table analyzed.
    
    SQL> select chain_cnt from user_tables where table_name = 'T1';
    
     CHAIN_CNT
    ----------
         10000
    
    SQL> alter table t1 move;
    
    Table altered.
    
    SQL> analyze table t1 compute statistics;
    
    Table analyzed.
    
    SQL> select chain_cnt from user_tables where table_name = 'T1';
    
     CHAIN_CNT
    ----------
         10000
    

    Certifique-se também de executar ANALYZE TABLE, porque é isso que atualiza CHAIN_CNT.

    • 2
  2. Michael Kutz
    2019-04-03T02:32:20+08:002019-04-03T02:32:20+08:00

    Linhas encadeadas é causada por linhas que são muito largas para caber em um (% de a) Bloco de Dados. A maneira mais fácil de criar linhas encadeadas é ter muitas colunas.

    Suas escolhas são:

    • aceitar o fato de que uma tabela de 250 colunas tem uma alta probabilidade de ter linhas encadeadas
    • refaça o design da sua mesa
    • 0
  3. D. Lohrsträter
    2022-07-21T01:09:59+08:002022-07-21T01:09:59+08:00

    Assim que o comprimento total da linha exceder o tamanho do bloco Oracle (menos alguns bytes para cabeçalho etc.) OU você exceder 255 colunas OU tiver colunas LONG ou LOB, você não poderá evitar linhas encadeadas.

    Você usou column chain_cnt, que é atualizado apenas caso você esteja realizandoANALYZE TABLE PERSON COMPUTE STATISTICS;

    Então, talvez você tenha lido chain_cntsem novo ANALYZE?

    Se as linhas forem maiores que o tamanho do bloco, uma boa ideia seria usar o espaço de tabela com um tamanho de bloco maior.

    • 0

relate perguntas

  • Backups de banco de dados no Oracle - Exportar o banco de dados ou usar outras ferramentas?

  • ORDER BY usando prioridades personalizadas para colunas de texto

  • Interface sqlplus confortável? [fechado]

  • Como encontrar as instruções SQL mais recentes no banco de dados?

  • Como posso consultar nomes usando expressões regulares?

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