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 / 46660
Accepted
Rachcha
Rachcha
Asked: 2013-07-20 00:09:57 +0800 CST2013-07-20 00:09:57 +0800 CST 2013-07-20 00:09:57 +0800 CST

ORA-04031: incapaz de alocar 4708660 bytes de memória compartilhada

  • 772

Estou executando o Oracle 11g R1 em minha máquina de desenvolvimento local.

Tenho tentado rodar um bloco anônimo para testar a FORALLinstrução no Oracle para inserir 25.000 registros.

Estou tendo o erro a seguir:

ORA-04031: unable to allocate 4708660 bytes of shared memory ("shared pool","DECLARE
  -- temp_rec temp%R...","PL/SQL SOURCE","PLD: Source Heap")
04031. 00000 -  "unable to allocate %s bytes of shared memory (\"%s\",\"%s\",\"%s\",\"%s\")"
*Cause:    More shared memory is needed than was allocated in the shared
           pool.
*Action:   If the shared pool is out of memory, either use the
           dbms_shared_pool package to pin large packages,
           reduce your use of shared memory, or increase the amount of
           available shared memory by increasing the value of the
           INIT.ORA parameters "shared_pool_reserved_size" and
           "shared_pool_size".
           If the large pool is out of memory, increase the INIT.ORA
           parameter "large_pool_size".

Eu tentei olhar aqui e aqui, mas não consegui resolver esse problema.

Eu tentei o seguinte:

ALTER SYSTEM FLUSH BUFFER_CACHE;  
ALTER SYSTEM FLUSH SHARED_POOL;
ALTER SYSTEM SET cursor_sharing = 'SIMILAR' SCOPE=BOTH;

Por favor ajude.

EDITAR

O código que estou usando é o seguinte:

DECLARE
  TYPE t_varchar IS TABLE OF varchar(512 char);
  biz_hierarchy t_varchar := t_varchar();
  project_team t_varchar := t_varchar();
  user_roles t_varchar := t_varchar();
  username t_varchar := t_varchar();
  sso t_varchar := t_varchar();
BEGIN
  SELECT *
  BULK COLLECT INTO biz_hierarchy, project_team, user_roles, username, sso
  FROM ... -- Query fetches 25000 records

  FORALL i IN biz_hierarchy.FIRST..biz_hierarchy.LAST
    INSERT INTO temp VALUES (biz_hierarchy(i), project_team(i),
                              user_roles(i), username(i), sso(i));

END;
/

O erro retornado pelo Oracle não menciona o número da linha. Se eu tentar carregar 5.000 registros, o bloco de código será executado com sucesso. Falha quando tento com 25000.

oracle oracle-11g
  • 2 2 respostas
  • 9453 Views

2 respostas

  • Voted
  1. Best Answer
    Frank Schmitt
    2013-07-20T05:23:13+08:002013-07-20T05:23:13+08:00

    Eu recomendo limitar o número de linhas que você busca em seu BULK COLLECT e envolver tudo dentro de um loop:

     -- create our output table
     create table temp as
     select 
       object_type as biz_hierarchy, 
       object_name as project_team, 
       object_name as user_roles,
       object_name as username, 
       object_name as sso
     from all_objects where 1=0;
    /
    
    DECLARE
      TYPE t_varchar IS TABLE OF varchar(512 char);
      biz_hierarchy t_varchar := t_varchar();
      project_team  t_varchar := t_varchar();
      user_roles    t_varchar := t_varchar();
      username      t_varchar := t_varchar();
      sso           t_varchar := t_varchar();
      cursor cur is
        select object_type as biz_hierarchy,
               object_name as project_team,
               object_name as user_roles,
               object_name as username,
               object_name as sso
          from all_objects
         where rownum <= 25000;
    BEGIN
      open cur;
      loop
        fetch cur BULK COLLECT
          INTO biz_hierarchy,
               project_team,
               user_roles,
               username,
               sso limit 1000;
        FORALL i IN biz_hierarchy.FIRST .. biz_hierarchy.LAST
          INSERT INTO temp
          VALUES
            (biz_hierarchy(i),
             project_team(i),
             user_roles(i),
             username(i),
             sso(i));
        exit when cur%notfound;  
      end loop;
    
    END;
    

    consulte Asktom sobre coleta em grande volume para obter mais informações

    • 1
  2. subodh chhabra
    2013-07-20T12:10:58+08:002013-07-20T12:10:58+08:00

    Pode haver 2 problemas aqui: você está ficando sem memória ao usar uma coleta em massa ou ao usar um forAll (tente um de cada vez para descobrir o problema). Eu recomendo a abordagem de Frank. é uma maneira realmente real de trabalhar com coletas em massa

    • 1

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

    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

    Conceder acesso a todas as tabelas para um usuário

    • 5 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
    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
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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