Colega, primeiro de tudo TENHO que observar que DROP de schema é uma operação que DEVERIA SER RARA, se vc está fazendo com frequência a sua lógica é meio questionável - entre outras razões, isso INVALIDA SQLs, não permitindo re-uso de cache, é faz uma porrada de I/Os... Muito bem, isso dito, veja lá que COMO EU DISSE, absolutamente ** não tem como ** vc não gerar redo log/undo para o DROP, como citei apenas ALGUMAS POUCAS operações o permitem, e DROP não é uma delas... Como eu disse também, além da questão de redo/undo, há OUTRAS operações que o DROP de um schema tem que fazer (tal como checks de constraints e quetais), SE vc (como eu disse) as fazer manualmente pode ser que obtenha ganho... Um exemplo :
==> crio dois schemas similares s...@o10gr2:SQL> create user user1 identified by user1; Usuário criado. s...@o10gr2:SQL> create user user2 identified by user2; Usuário criado. s...@o10gr2:SQL> grant connect, resource to user1; Concessão bem-sucedida. s...@o10gr2:SQL> grant connect, resource to user2; Concessão bem-sucedida. s...@o10gr2:SQL>grant select on sys.v_$session to user1; Concessão bem-sucedida. s...@o10gr2:SQL>grant select on sys.v_$session to user2; Concessão bem-sucedida. ==> populo o schema user1 com tabelas, constraints, índices us...@o10gr2:SQL>create sequence seque1; Seqüência criada. us...@o10gr2:SQL>create table TAB_PAI_1 nologging as (select 0 codigo, d.* from all_objects d where 1=2); Tabela criada. us...@o10gr2:SQL>create table TAB_FILHA_1 nologging as (select 0 codigo, d.* from all_objects d where 1=2); Tabela criada. us...@o10gr2:SQL>BEGIN 2 for i in 1..15 loop 3 insert /*+ APPEND */ into TAB_PAI_1 (select seque1.nextval, d.* from all_objects d); 4 commit; 5 end loop; 6 END; 7 / Procedimento PL/SQL concluído com sucesso. us...@o10gr2:SQL>insert /*+ APPEND */ into TAB_FILHA_1 (select * from TAB_PAI_1); 617685 linhas criadas. us...@o10gr2:SQL>commit; Commit concluído. us...@o10gr2:SQL>alter table TAB_PAI_1 add constraint TAB_PAI_1_PK primary key (CODIGO) novalidate; Tabela alterada. us...@o10gr2:SQL>alter table TAB_FILHA_1 add constraint TAB_FILHA_1_FK foreign key (codigo) references TAB_PAI_1(codigo) novalidate; Tabela alterada. us...@o10gr2:SQL>disc; Desconectado de Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production ==> populo o schema user2 de maneira similar : us...@o10gr2:SQL>create sequence seque2; Seqüência criada. us...@o10gr2:SQL>create table TAB_PAI_2 nologging as (select 0 codigo, d.* from all_objects d where 1=2); Tabela criada. us...@o10gr2:SQL>create table TAB_FILHA_2 nologging as (select 0 codigo, d.* from all_objects d where 1=2); Tabela criada. us...@o10gr2:SQL>BEGIN 2 for i in 1..15 loop 3 insert /*+ APPEND */ into TAB_PAI_2 (select seque2.nextval, d.* from all_objects d); 4 commit; 5 end loop; 6 END; 7 / Procedimento PL/SQL concluído com sucesso. us...@o10gr2:SQL>insert /*+ APPEND */ into TAB_FILHA_2 (select * from TAB_PAI_2); 617685 linhas criadas. us...@o10gr2:SQL>commit; Commit concluído. us...@o10gr2:SQL>alter table TAB_PAI_2 add constraint TAB_PAI_2_PK primary key (CODIGO) novalidate; Tabela alterada. us...@o10gr2:SQL>alter table TAB_FILHA_2 add constraint TAB_FILHA_2_FK foreign key (codigo) references TAB_PAI_2(codigo) novalidate; Tabela alterada. us...@o10gr2:SQL>disc; Desconectado de Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production ===> dropo o schema user1 diretamente : us...@o10gr2:SQL>conn system/ora...@o10gr2 Conectado. Sessão alterada. sys...@o10gr2:SQL>select sid from v$session where audsid=userenv('sessionid'); SID ---- 137 sys...@o10gr2:SQL>set timing on sys...@o10gr2:SQL>drop user user1 cascade; Usuário eliminado. Decorrido: 00:00:07.61 ==> vejo quanto gerou de undo/redo s...@o10gr2:SQL>select name,a.value 2 from v$sesstat a, v$sysstat b 3 where b.statistic#=a.statistic# 4 and (b.name ='redo size' or b.name = 'undo change vector size') 5 and sid = 137; NAME VALUE ---------------------------------------------------------------- ------------------ redo size 173228 undo change vector size 47420 ==> agora vou pedir DROP com PURGE , remover constraints sem validar, antes de remover o schema... us...@o10gr2:SQL>conn user2/us...@o10gr2 Conectado. Sessão alterada. us...@o10gr2:SQL>select sid from v$session where audsid=userenv('sessionid'); SID ---- 145 us...@o10gr2:SQL>set timing on us...@o10gr2:SQL>alter table TAB_FILHA_2 disable constraint TAB_FILHA_2_FK; Tabela alterada. Decorrido: 00:00:00.06 us...@o10gr2:SQL>alter table TAB_PAI_2 disable constraint TAB_PAI_2_PK; Tabela alterada. Decorrido: 00:00:00.17 us...@o10gr2:SQL>alter table TAB_FILHA_2 drop constraint TAB_FILHA_2_FK; Tabela alterada. Decorrido: 00:00:00.07 us...@o10gr2:SQL>alter table TAB_PAI_2 drop constraint TAB_PAI_2_PK; Tabela alterada. Decorrido: 00:00:00.10 us...@o10gr2:SQL>drop table TAB_PAI_2 purge; Tabela eliminada. Decorrido: 00:00:00.14 us...@o10gr2:SQL>drop table TAB_FILHA_2 purge; Tabela eliminada. Decorrido: 00:00:00.12 us...@o10gr2:SQL> ==> veja por enquanto que a sessão gerou um tanto menos de undo/redo, ** MAS ** confira (somando os TIMINGs) que demorou um pouco menos : s...@o10gr2:SQL>select name,a.value 2 from v$sesstat a, v$sysstat b 3 where b.statistic#=a.statistic# 4 and (b.name ='redo size' or b.name = 'undo change vector size') 5 and sid = 145; NAME VALUE ---------------------------------------------------------------- ------------------ redo size 171848 undo change vector size 45832 ==> vamos desconectar, conectar com outro usuário e ver quanto demora e gera de undo/redo o drop sem objeto nenhum : Decorrido: 00:00:00.12 us...@o10gr2:SQL>disc; Desconectado de Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production sys...@o10gr2:SQL>disc; Desconectado de Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production With the Partitioning, Oracle Label Security, OLAP, Data Mining Scoring Engine and Real Application Testing options sys...@o10gr2:SQL>disc; sys...@o10gr2:SQL>conn system/ora...@o10gr2 Conectado. Sessão alterada. Decorrido: 00:00:00.04 sys...@o10gr2:SQL>select sid from v$session where audsid=userenv('sessionid'); SID ---- 149 Decorrido: 00:00:00.07 sys...@o10gr2:SQL>drop user user2 cascade; Usuário eliminado. Decorrido: 00:00:00.20 ==> agora sim, vamos medir o drop do schema vazio : s...@o10gr2:SQL>l 1 select name,a.value 2 from v$sesstat a, v$sysstat b 3 where b.statistic#=a.statistic# 4 and (b.name ='redo size' or b.name = 'undo change vector size') 5* and sid = 149 s...@o10gr2:SQL>/ NAME VALUE ---------------------------------------------------------------- ------------------ redo size 11436 undo change vector size 4660 =======>>> Resumo da história : de redo/undo o drop direto gerou 173228 e 47420, enquanto o procedimento completo #2 gerou 171848 + 11436 = 183284 (pouco mais) e 45832 + 4660 = 50492 (também um pouco mais), MAS de tempo, o drop direto demorou 00:00:07.61 , enquanto o procedimento completo #2 levou 0.06 + 0.17 + 0.07 + 0.10 + 0.14 + 0.12 + 0.20 = 0.86, menos tempo... []s Chiappa --- Em oracle_br@yahoogrupos.com.br, "Aleksandro Souza Azevedo" <aleksandroso...@...> escreveu > > Também é isso, primeiro é pela velocidade, e segundo porque estava lotando o > undo. Eu diminui o tempo de retenção porém não melhorei a performance. Eu > dou meus pulos. > > > > > > De: oracle_br@yahoogrupos.com.br [mailto:oracle...@yahoogrupos.com.br] Em > nome de Luiz Antonio Camargo > Enviada em: sexta-feira, 4 de setembro de 2009 05:51 PM > Para: oracle_br@yahoogrupos.com.br > Assunto: Re: [oracle_br] Re: É possivel dropar usuario sem gerar logs na > tabela de undo ? > > > > > > Pelo que entendi, o que ele está querendo é para não "lotar" a TBS de undo. > Já passei apertado porisso (rs) e aprendi o PURGE.... primeiro dropa as > tabelas com purge depois o user... é isso? > > flw > > 2009/9/4 jlchiappa <jlchia...@... <mailto:jlchiappa%40yahoo.com.br> > > > > > > > > > Colega, pode consultar na documentação (que é grátis e está Online em > > http://tahiti.oracle.com ), que apenas algumas *** POUCAS *** operações > > (como INSERT APPEND, alguns CREATEs, etc) levam em conta o status de > > NOLOGGING, e o drop user ** Não É ** uma delas, o DROP USER vai sim ** > > sempre ** gerar log ... > > Explique porém exatamente o porque de vc querer isso (é para acelerar um > > DROP que está demorando muito, talvez) , que a gente pode palpitar : Por > > exemplo, ao invés de DROP USER direto antes desligar ou dropar SEM VALIDAR > > as constraints, ter vários JOBs dropando - com PURGE !! - as tabelas em > > paralelo . pra depois fazer o DROP USER.... Mas digalá o que vc > quer/precisa > > que a gente pode palpitar ... > > > > []s > > > > Chiappa > > > > --- Em oracle_br@yahoogrupos.com.br > <mailto:oracle_br%40yahoogrupos.com.br> <oracle_br%40yahoogrupos.com.br>, > > "aleksandrosouza" <aleksandrosouza@> escreveu > > > > > > Foi a primeira coisa que eu fiz, mas ele gera mesmo assim. > > > > > > --- Em oracle_br@yahoogrupos.com.br > <mailto:oracle_br%40yahoogrupos.com.br> <oracle_br%40yahoogrupos.com.br>, > > "kurtnaxl" <thiagoecatia@> escreveu > > > > > > > > Não tenho Oracle disponível para testar, mas de repente o NOLOGGING > > também funcione para isso... DROP USER xxxxxx NOLOGGING; > > > > > > > > Tente e informe se funfa... > > > > abçs > > > > > > > > --- Em oracle_br@yahoogrupos.com.br > <mailto:oracle_br%40yahoogrupos.com.br> <oracle_br%40yahoogrupos.com.br>, > > "aleksandrosouza" <aleksandrosouza@> escreveu > > > > > > > > > > Tenho a necessidade de dropar um usuário sem gerar lançamentos na > > tabels UNDOTBS. É possível eu fazer alguma configuração ?. > > > > > Meu oracle é 11g 11.2 > > > > > > > > > > > > > > > > > > > > [As partes desta mensagem que não continham texto foram removidas] > > > > > > [As partes desta mensagem que não continham texto foram removidas] >