Pular para o conteúdo
  • Este tópico contém 1 resposta, 2 vozes e foi atualizado pela última vez 7 anos, 6 meses atrás por Avatar photoJosé Laurindo Chiappa.
Visualizando 2 posts - 1 até 2 (de 2 do total)
  • Autor
    Posts
  • #108762
    Avatar de filipe009filipe009
    Participante

      Olá Senhores,
      Estou passando por um dilema. Existe uma procedure que é executada simultaneamente por diferentes usuários. No entanto, essa procedure possui inúmeras tabelas temporárias que sofrem limpeza. Como o processo é executado simultaneamente por inúmeras pessoas, um usuário está limpando os dados de outro usuário. Para tentar sanar o problema tentei criar uma tabela temporária global, porém, não sei se essa é a melhor solução. Alguém poderia me encaminhar alguma dica para tentar criar uma solução mais inteligente?

      #108763
      Avatar photoJosé Laurindo Chiappa
      Moderador

        Blz ? Sim, no RDBMS Oracle se vc tem dados que **** realmente **** se encaixam no perfil de dados temporários (ie, são dados que pertencem/são acessados APENAS pela mesma sessão que os criou, E vc quer que automaticamente após o uso por parte dessa sessão esses dados desapareçam) sem sombra de dúvida o procedimento correto é criar uma GLOBAL TEMPORARY TABLE, sim – SE os seus dados se encaixam nessa definição ESTRITA de dados temporários que citei, absolutamente não há alternativa melhor, geralmente… Uma exceção a isso seria o caso em que os dados temporários vem de uma outra tabela do banco (uma external table, que seja), nesse caso vc pode usar o conceito de CTE e escrever uma cláusula WITH com o hint MATERIALIZE, aí os dados da sub-query com CTE vão automaticamente pro disco e vão sumir depois do uso, sem vc ter que criar nada fisicamente, veja https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:9531849900346330282 para um exemplo….

        Já se os dados que vc tem não se encaixam nessa definição acima de temporários (digamos, o aplicativo abre várias threads, e cada thread abre uma sessão diferente no banco, OU vc tem pool de conexões, onde cada comando pode ser atendido por uma sessão diferente), aí miou usar tabela temporária – a primeira coisa seria vc criar uma tabela física real que contem uma coluna USUARIO além das demais colunas necessárias : SE vc tiver a opção de PARTICIONAMENTO no seu database Oracle licenciada e disponível aí seria simplesmente ** particionar ** por essa coluna usuário, aí vc inseriria os dados de cada usuário numa PARTIÇÃO diferente, aí na hora de limpar os dados só do usuário X vc simplesmente faria um TRUNCATE nomedatabela PARTITION partiçãodousuárioX …. Isso deve ser Muito Rápido do que um DELETE , não atua na tabela toda (como aconteceria com um TRNCATE TABLE), e AUTOMAGICAMENTE limita a remoção apenas ao usuário X…

        Já se vc não respeitar a definição de ‘dados temporários’ acima (e portanto não poder usar GTTs), e também não é o caso de CTE, ** E ** também não tiver o Particionamento ativo/licenciado/disponível, aí é a baixa tecnologia mesmo : na tabela com a coluna USUARIO criada depois de a usar vc teria que fazer um DELETE FROM tabelareal WHERE USUARIO=X para remover apenas os dados de X, não tem jeito acho eu….

        []s

        Chiappa

        IMPORTANTE : eu fiquei DESCONFIADO com a expressão “on-the-fly” que vc usou : saiba que no RDBMS Oracle mesmo a GTT ** tem ** que ser criada antes de vc a usar – ao contrário de outros RDBMSs, no Oracle o correto é ** ANTES ** de vc a usar vc já ter feito o CREATE GLOBAL TEMPORARY TABLE, aí na procedure vc só faria os INSERTs/UPDATEs/DELETEs/SELECTs que precisar : no link que passei acima o Autor fala um pouco disso também…

      Visualizando 2 posts - 1 até 2 (de 2 do total)
      • Você deve fazer login para responder a este tópico.
      plugins premium WordPress