Re: [oracle_br] Re: Ajuda query
Sorry, quis dizer DBA_TEMP_FILES, óbvio... ---Em oracle_br@yahoogrupos.com.br, escreveu: Esse é o ponto, não vi muito sentido em se dar ao trabalho de consultar a DBA_DATA_FILES sendo que depois o WHERE contents in ('TEMPORARY' vai Eliminar os dados desse select - tanto que cfrme meu resultado a minha tablespace TEMP nem aparece... []s Chiappa ---Em oracle_br@yahoogrupos.com.br, escreveu: Muito obrigado pela ajuda Chiappa. Só para complementar, essa query foi retirada do blog do Tanel Poder. Todos os scripts que ele disponibiliza foi ele mesmo quem criou. Em relação a UNDO e TEMP, tinha adicionado a consulta para excluir as duas tablespaces da query: AND t.tablespace_name not in (select tablespace_name from dba_tablespaces where contents in ('TEMPORARY','UNDO')) Já possuo as queries que fazem o monitoramento do UNDO e da TEMP Obrigado. Em quarta-feira, 4 de julho de 2018 13:55:57 BRT, jlchia...@yahoo.com.br [oracle_br] escreveu: Blz ? Então, antes de tar a sua resposta, uma Obs : tenha ** certeza ** que a lógica implementada nesse tal script aí está correta principalmente no tocante à tablespace de UNDO e tablespace TEMP - como Acredito que vc deve saber, o espaço usado REAL na tablespace de UNDO vc deve consultar na V$TRANSACTION e o espaço REAL em uso na temp tablespace vc consulta na V$SORT_USAGE/V$SORT_SEGMENT Outra coisa é CUIDADO ao calcular %used e %free em datafiles auto-extensíveis : como vc sabe, o valor máximo de extensão é um limite FUTURO, a ser imposto AO SISTEMA OPERACIONAL não agora mas apenas QUANDO a tablespace crescer.. Assim, então em tese vc deveria SOMAR os autoextensíveis todos, verificar quanto vc tem livre em disco no sistema operacional e o espaço livre ** REAL ** seria a diferença desses dois... Muito bem, aviso dado vamos à resposta : primeiro vamos executar a tua query sem alterações : SYSTEM:@O11GR2SE:SQL>get t.sql 1 SELECT t.tablespace_name, t.mb "TotalMB" 2 ,t.mb - nvl(f.mb,0) "UsedMB" 3 , nvl(f.mb,0) "FreeMB" 4 ,lpad(ceil((1-nvl(f.mb,0)/decode(t.mb,0,1,t.mb))*100)||'%', 6) "% Used" 5 ,t.ext "Ext" 6 , '|'||rpad(lpad('#',ceil((1-nvl(f.mb,0)/decode(t.mb,0,1,t.mb))*20),'#'),20,' ')||'|' "Used" 7 FROM 8 ( 9 select tablespace_name, trunc(sum(bytes)/1048576) MB 10 from dba_free_space 11group by tablespace_name 12 union all 13 select tablespace_name, trunc(sum(bytes_free)/1048576) MB 14 from v$temp_space_header 15group by tablespace_name 16 ) f, 17 (select tablespace_name, trunc(sum(bytes)/1048576) MB, max(autoextensible) ext 18from dba_data_files 19 group by tablespace_name 20 union all 21 select tablespace_name, trunc(sum(bytes)/1048576) MB, max(autoextensible) ext 22from dba_temp_files 23 group by tablespace_name 24 ) t 25 WHERE t.tablespace_name = f.tablespace_name (+) 26 AND t.tablespace_name not in (select tablespace_name from dba_tablespaces where contents in ('TEMPORARY','UNDO')) 27 ORDER BY t.tablespace_name; SYSTEM:@O11GR2SE:SQL>@t TABLESPACE_NAME TotalMB UsedMB FreeMB % Used Ext Used -- -- -- -- -- --- -- EXAMPLE 313 3927413% YES |### | STATSPACK 372355 1796% YES || SYSAUX580537 4393% YES |### | SYSTEM 1760 1721 3998% YES || TS_TESTE 363346 1796% YES || USERS1297 1235 6296% YES || 6 linhas selecionadas. ==> Okdoc... Bem, pelo que entendi a tua dúvida decorre primeiro do fato de a coluna "% Used" ser o resultado de uma expressão, o que o Oracle não deixa usar em GROUP BY, em WHERE A solução para isso é simplesmente ter um query EXTERNA, que use na cláusula de FROM a query original, assim 'materializando' as expressões O segundo ponto que imagino te pegou foi o FATO de que essa coluna é uma CONTA/expressão numérica CONCATENADA com um caracter '%' : necessariamente se vc concatena uma string com uma conta o resultado é string, pra vc poder restringir com >= vc TEM que converter de volta pra número, assim : SYSTEM:@O11GR2SE:SQL>get t.sql 1 select * 2 from 3 ( 4 SELECT t.tablespace_name, t.mb "TotalMB" 5 ,t.mb - nvl(f.mb,0) "UsedMB" 6 , nvl(f.mb,0) "FreeMB" 7 ,lpad(ceil((1-nvl(f.mb,0)/decode(t.mb,0,1,t.mb))*100)||'%', 6) "% Us
Re: [oracle_br] Re: Ajuda query
Ah, e como eu falei repito : ** espero ** que tuas rotinas pra achar o %free real dos datafiles/tempfiles autoextensíveis some o que está alocado hoje, some o total livre em disco lá 'fora', lá no sistema operacional e aí sim calcule ESSA diferença... Não é porque vc tem 10 datafiles autoextensíveis cada um com 10 GB que vc EFETIVAMENTE possa crescer até 100 GB , isso só ocorrerá se o sistema operacional/storage de discos realmente tem esse espaço livre... []s Chiappa
Re: [oracle_br] Re: Ajuda query
Esse é o ponto, não vi muito sentido em se dar ao trabalho de consultar a DBA_DATA_FILES sendo que depois o WHERE contents in ('TEMPORARY' vai Eliminar os dados desse select - tanto que cfrme meu resultado a minha tablespace TEMP nem aparece... []s Chiappa ---Em oracle_br@yahoogrupos.com.br, escreveu: Muito obrigado pela ajuda Chiappa. Só para complementar, essa query foi retirada do blog do Tanel Poder. Todos os scripts que ele disponibiliza foi ele mesmo quem criou. Em relação a UNDO e TEMP, tinha adicionado a consulta para excluir as duas tablespaces da query: AND t.tablespace_name not in (select tablespace_name from dba_tablespaces where contents in ('TEMPORARY','UNDO')) Já possuo as queries que fazem o monitoramento do UNDO e da TEMP Obrigado. Em quarta-feira, 4 de julho de 2018 13:55:57 BRT, jlchia...@yahoo.com.br [oracle_br] escreveu: Blz ? Então, antes de tar a sua resposta, uma Obs : tenha ** certeza ** que a lógica implementada nesse tal script aí está correta principalmente no tocante à tablespace de UNDO e tablespace TEMP - como Acredito que vc deve saber, o espaço usado REAL na tablespace de UNDO vc deve consultar na V$TRANSACTION e o espaço REAL em uso na temp tablespace vc consulta na V$SORT_USAGE/V$SORT_SEGMENT Outra coisa é CUIDADO ao calcular %used e %free em datafiles auto-extensíveis : como vc sabe, o valor máximo de extensão é um limite FUTURO, a ser imposto AO SISTEMA OPERACIONAL não agora mas apenas QUANDO a tablespace crescer.. Assim, então em tese vc deveria SOMAR os autoextensíveis todos, verificar quanto vc tem livre em disco no sistema operacional e o espaço livre ** REAL ** seria a diferença desses dois... Muito bem, aviso dado vamos à resposta : primeiro vamos executar a tua query sem alterações : SYSTEM:@O11GR2SE:SQL>get t.sql 1 SELECT t.tablespace_name, t.mb "TotalMB" 2 ,t.mb - nvl(f.mb,0) "UsedMB" 3 , nvl(f.mb,0) "FreeMB" 4 ,lpad(ceil((1-nvl(f.mb,0)/decode(t.mb,0,1,t.mb))*100)||'%', 6) "% Used" 5 ,t.ext "Ext" 6 , '|'||rpad(lpad('#',ceil((1-nvl(f.mb,0)/decode(t.mb,0,1,t.mb))*20),'#'),20,' ')||'|' "Used" 7 FROM 8 ( 9 select tablespace_name, trunc(sum(bytes)/1048576) MB 10 from dba_free_space 11group by tablespace_name 12 union all 13 select tablespace_name, trunc(sum(bytes_free)/1048576) MB 14 from v$temp_space_header 15group by tablespace_name 16 ) f, 17 (select tablespace_name, trunc(sum(bytes)/1048576) MB, max(autoextensible) ext 18from dba_data_files 19 group by tablespace_name 20 union all 21 select tablespace_name, trunc(sum(bytes)/1048576) MB, max(autoextensible) ext 22from dba_temp_files 23 group by tablespace_name 24 ) t 25 WHERE t.tablespace_name = f.tablespace_name (+) 26 AND t.tablespace_name not in (select tablespace_name from dba_tablespaces where contents in ('TEMPORARY','UNDO')) 27 ORDER BY t.tablespace_name; SYSTEM:@O11GR2SE:SQL>@t TABLESPACE_NAME TotalMB UsedMB FreeMB % Used Ext Used -- -- -- -- -- --- -- EXAMPLE 313 3927413% YES |### | STATSPACK 372355 1796% YES || SYSAUX580537 4393% YES |### | SYSTEM 1760 1721 3998% YES || TS_TESTE 363346 1796% YES || USERS1297 1235 6296% YES || 6 linhas selecionadas. ==> Okdoc... Bem, pelo que entendi a tua dúvida decorre primeiro do fato de a coluna "% Used" ser o resultado de uma expressão, o que o Oracle não deixa usar em GROUP BY, em WHERE A solução para isso é simplesmente ter um query EXTERNA, que use na cláusula de FROM a query original, assim 'materializando' as expressões O segundo ponto que imagino te pegou foi o FATO de que essa coluna é uma CONTA/expressão numérica CONCATENADA com um caracter '%' : necessariamente se vc concatena uma string com uma conta o resultado é string, pra vc poder restringir com >= vc TEM que converter de volta pra número, assim : SYSTEM:@O11GR2SE:SQL>get t.sql 1 select * 2 from 3 ( 4 SELECT t.tablespace_name, t.mb "TotalMB" 5 ,t.mb - nvl(f.mb,0) "UsedMB" 6 , nvl(f.mb,0) "FreeMB" 7 ,lpad(ceil((1-nvl(f.mb,0)/decode(t.mb,0,1,t.mb))*100)||'%', 6) "% Used" 8 ,t.ext "Ext" 9
Re: [oracle_br] Re: Ajuda query
Muito obrigado pela ajuda Chiappa. Só para complementar, essa query foi retirada do blog do Tanel Poder. Todos os scripts que ele disponibiliza foi ele mesmo quem criou. Em relação a UNDO e TEMP, tinha adicionado a consulta para excluir as duas tablespaces da query: AND t.tablespace_name not in (select tablespace_name from dba_tablespaces where contents in ('TEMPORARY','UNDO')) Já possuo as queries que fazem o monitoramento do UNDO e da TEMPObrigado.Em quarta-feira, 4 de julho de 2018 13:55:57 BRT, jlchia...@yahoo.com.br [oracle_br] escreveu: Blz ? Então, antes de tar a sua resposta, uma Obs : tenha ** certeza ** que a lógica implementada nesse tal script aí está correta principalmente no tocante à tablespace de UNDO e tablespace TEMP - como Acredito que vc deve saber, o espaço usado REAL na tablespace de UNDO vc deve consultar na V$TRANSACTION e o espaço REAL em uso na temp tablespace vc consulta na V$SORT_USAGE/V$SORT_SEGMENT Outra coisa é CUIDADO ao calcular %used e %free em datafiles auto-extensíveis : como vc sabe, o valor máximo de extensão é um limite FUTURO, a ser imposto AO SISTEMA OPERACIONAL não agora mas apenas QUANDO a tablespace crescer.. Assim, então em tese vc deveria SOMAR os autoextensíveis todos, verificar quanto vc tem livre em disco no sistema operacional e o espaço livre ** REAL ** seria a diferença desses dois... Muito bem, aviso dado vamos à resposta : primeiro vamos executar a tua query sem alterações : SYSTEM:@O11GR2SE:SQL>get t.sql 1 SELECT t.tablespace_name, t.mb "TotalMB" 2 , t.mb - nvl(f.mb,0) "UsedMB" 3 , nvl(f.mb,0) "FreeMB" 4 ,lpad(ceil((1-nvl(f.mb,0)/decode(t.mb,0,1,t.mb))*100)||'%', 6) "% Used" 5 , t.ext "Ext" 6 , '|'||rpad(lpad('#',ceil((1-nvl(f.mb,0)/decode(t.mb,0,1,t.mb))*20),'#'),20,' ')||'|' "Used" 7 FROM 8 ( 9 select tablespace_name, trunc(sum(bytes)/1048576) MB 10 from dba_free_space 11 group by tablespace_name 12 union all 13 select tablespace_name, trunc(sum(bytes_free)/1048576) MB 14 from v$temp_space_header 15 group by tablespace_name 16 ) f, 17 (select tablespace_name, trunc(sum(bytes)/1048576) MB, max(autoextensible) ext 18 from dba_data_files 19 group by tablespace_name 20 union all 21 select tablespace_name, trunc(sum(bytes)/1048576) MB, max(autoextensible) ext 22 from dba_temp_files 23 group by tablespace_name 24 ) t 25 WHERE t.tablespace_name = f.tablespace_name (+) 26 AND t.tablespace_name not in (select tablespace_name from dba_tablespaces where contents in ('TEMPORARY','UNDO')) 27 ORDER BY t.tablespace_name; SYSTEM:@O11GR2SE:SQL>@t TABLESPACE_NAME TotalMB UsedMB FreeMB % Used Ext Used -- -- -- -- -- --- -- EXAMPLE 313 39 274 13% YES |### | STATSPACK 372 355 17 96% YES || SYSAUX 580 537 43 93% YES |### | SYSTEM 1760 1721 39 98% YES || TS_TESTE 363 346 17 96% YES || USERS 1297 1235 62 96% YES || 6 linhas selecionadas. ==> Okdoc... Bem, pelo que entendi a tua dúvida decorre primeiro do fato de a coluna "% Used" ser o resultado de uma expressão, o que o Oracle não deixa usar em GROUP BY, em WHERE A solução para isso é simplesmente ter um query EXTERNA, que use na cláusula de FROM a query original, assim 'materializando' as expressões O segundo ponto que imagino te pegou foi o FATO de que essa coluna é uma CONTA/expressão numérica CONCATENADA com um caracter '%' : necessariamente se vc concatena uma string com uma conta o resultado é string, pra vc poder restringir com >= vc TEM que converter de volta pra número, assim : SYSTEM:@O11GR2SE:SQL>get t.sql 1 select * 2 from 3 ( 4 SELECT t.tablespace_name, t.mb "TotalMB" 5 , t.mb - nvl(f.mb,0) "UsedMB" 6 , nvl(f..mb,0) "FreeMB" 7 ,lpad(ceil((1-nvl(f.mb,0)/decode(t.mb,0,1,t.mb))*100)||'%', 6) "% Used" 8 , t.ext "Ext" 9 , '|'||rpad(lpad('#',ceil((1-nvl(f.mb,0)/decode(t.mb,0,1,t.mb))*20),'#'),20,' ')||'|' "Used" 10 FROM 11 ( 12 select tablespace_name, trunc(sum(bytes)/1048576) MB 13 from dba_free_space 14 group by tablespace_name 15 union all 16 select tablespace_name, trunc(
Re: [oracle_br] Re: Ajuda query
Provavelmente vc deve ter presente nesse database dados de auditoria de mito tempo atrás, ocupando espaço, ou talvez vc não tenha estatísticas adequadas nas tabelas do sistema e por isso o banco esteja gerando um full table scan nalguma tabela interna grande . Verifique a possibilidade de coletar estatísticas nas tabelas internas do sistema, e se não resolver, experimente um select distinct username na dba_audit_session : se um select simples for razoavelmente bem, crie uma tabela sua com essas dados e use-a na query []s Chiappa
Re: [oracle_br] Re: Ajuda query
Obrigado Chiappa. Mas a última query para descobrir quais usuários nunca logaram no database, rodou por mais de 10 horas e acabei cancelando a consulta. select * from dba_users where username not in (select distinct username from dba_audit_session); No mais, obrigado pelas dicas. Em ter, 23/9/14, jlchia...@yahoo.com.br [oracle_br] escreveu: Assunto: [oracle_br] Re: Ajuda query Para: oracle_br@yahoogrupos.com.br Data: Terça-feira, 23 de Setembro de 2014, 15:43 Bem, primeiro que fique ** CLARO ** que o que vamos comentar aqui é válido SE a apenas ** SE ** o database em questão está rodando com a opção de audit session ligada, okdoc ?? Isso é default nas versões mais recentes mas Não Necessariamente vc pode assumir que está ativa no seu database, ok ?? Isso posto : consultar os logons dos usuários é simplérrimo : select username, timestamp from dba_audit_session where action_name = 'LOGON' group by username; para alterar para trazer só o último logon (de modo que se possa comparar com a data de hoje e ver se já passou um ano, que é o que vc vai querer) é simplesmente : select username, max(timestamp) ultimo_logon from dba_audit_session where action_name = 'LOGON' group by username; aí, para poder colocar uma cláusula de filtro na coluna de último logon, eu faria assim : select * from ( select username, max(timestamp) ultimo_logon from dba_audit_session where action_name = 'LOGON' group by username ) where (sysdate - ultimo_logon) > 365; Blz ? Taí Eu só diria para vc ** não ** listar os usuários que não estejam presentes na DBA_AUDIT_SESSION, pois não tem como saber se usuário realmente era pra logar mas nunca logou OU se é um schema criado só pra conter objetos, e que assim nunca deveria ter logado no banco mesmo... No máximo, o que eu faria se fosse vc, além da query acima eu faria uma outra, para mostrar usuários que nunca logaram : select * from dba_users where username not in (select distinct username from dba_audit_session); ==> MAS depois confira essa lista com o pessoal da aplicação, para tentar identificar quais desses usuários que nunca logaram são simples repositórios e quais realmente são usuários que iriam logar no database mas nunca o fizeram ... []s Chiappa #yiv7667436662 #yiv7667436662 -- #yiv7667436662ygrp-mkp { border:1px solid #d8d8d8;font-family:Arial;margin:10px 0;padding:0 10px;} #yiv7667436662 #yiv7667436662ygrp-mkp hr { border:1px solid #d8d8d8;} #yiv7667436662 #yiv7667436662ygrp-mkp #yiv7667436662hd { color:#628c2a;font-size:85%;font-weight:700;line-height:122%;margin:10px 0;} #yiv7667436662 #yiv7667436662ygrp-mkp #yiv7667436662ads { margin-bottom:10px;} #yiv7667436662 #yiv7667436662ygrp-mkp .yiv7667436662ad { padding:0 0;} #yiv7667436662 #yiv7667436662ygrp-mkp .yiv7667436662ad p { margin:0;} #yiv7667436662 #yiv7667436662ygrp-mkp .yiv7667436662ad a { color:#ff;text-decoration:none;} #yiv7667436662 #yiv7667436662ygrp-sponsor #yiv7667436662ygrp-lc { font-family:Arial;} #yiv7667436662 #yiv7667436662ygrp-sponsor #yiv7667436662ygrp-lc #yiv7667436662hd { margin:10px 0px;font-weight:700;font-size:78%;line-height:122%;} #yiv7667436662 #yiv7667436662ygrp-sponsor #yiv7667436662ygrp-lc .yiv7667436662ad { margin-bottom:10px;padding:0 0;} #yiv7667436662 #yiv7667436662actions { font-family:Verdana;font-size:11px;padding:10px 0;} #yiv7667436662 #yiv7667436662activity { background-color:#e0ecee;float:left;font-family:Verdana;font-size:10px;padding:10px;} #yiv7667436662 #yiv7667436662activity span { font-weight:700;} #yiv7667436662 #yiv7667436662activity span:first-child { text-transform:uppercase;} #yiv7667436662 #yiv7667436662activity span a { color:#5085b6;text-decoration:none;} #yiv7667436662 #yiv7667436662activity span span { color:#ff7900;} #yiv7667436662 #yiv7667436662activity span .yiv7667436662underline { text-decoration:underline;} #yiv7667436662 .yiv7667436662attach { clear:both;display:table;font-family:Arial;font-size:12px;padding:10px 0;width:400px;} #yiv7667436662 .yiv7667436662attach div a { text-decoration:none;} #yiv7667436662 .yiv7667436662attach img { border:none;padding-right:5px;} #yiv7667436662 .yiv7667436662attach label { display:block;margin-bottom:5px;} #yiv7667436662 .yiv7667436662attach label a { text-decoration:none;} #yiv7667436662 blockquote { margin:0 0 0 4px;} #yiv7667436662 .yiv7667436662bold { font-family:Arial;font-size:13px;font-weight:700;} #yiv7667436662 .yiv7667436662bold a { text-decoration:none;} #yiv7667436662 dd.yiv7667436662last p a { font-family:Verdana;font-weight:700;} #yiv7667436662 dd.yiv7667436662last p span { margin-right:10px;font-family:Verdana;font-weight:700;} #yiv7667436662 dd
Re: [oracle_br] Re: Ajuda - Query Range de datas para Range de datas
Fala Chiappa, obrigado pela resposta Bom, minha especificação mudou de uma hora para outra e tive que fazer de outra forma ... e já fiz .. hehe Conhecia este link e tenho uma função parecida com ele que no caso verifica em um range de datas se existem registros que estão dentro daquela situação. Tentei adapta-lo só que não deu muito certo. --- O problema com exemplos era: supondo que na minha tabela tem: id | dt_ini | dt_fim 1 | 01/01/2014 | 15/01/2014 2 | 16/01/2014 | 18/01/2014 3 | 21/01/2014 | 25/01/2014 supondo que tenho os ranges passados por parâmetros a) 01/01/2014 e 20/01/2014 b) 15/01/2014 e 21/01/2014 c) 22/01/2014 e 25/01/2014 A query do exemplo atenderia se fossem válidos furos entre as datas, ou seja, funcionaria para as 3 letras (a), (b) e (c) que retornariam os registros 1 - 2, 1 - 2 e - 3 respectivamente. Só que a única correta é a (c) que traz o registro 3 sem furos na data especificada agora supondo que tenho a) 02/01/2014 e 18/01/2014 b) 02/01/2014 e 19/01/2014 Então minha tela azul estava em trazer sem furos os registros. No exemplo de cima, sei que a letra (a) me traria os registros -1 e -2. Já a letra (b) não me deveria trazer nenhum porque não se tem um range completo na base que compreende 02/01 até 19/01... faltaria 1 dia. Não sei se fui claro, se estou viajando. Talvez tenha alguma forma simples de fazer que eu ainda não sei qual é. Como falei no inicio minha especificação mudou e acabou me salvando de cair nesse caso, mas segue o exemplo onde acho que consegui explicar e mesmo não tendo que fazer, gostaria de tirar a dúvida de como faria. kkk Obrigado! Em 6 de agosto de 2014 14:59, jlchia...@yahoo.com.br [oracle_br] < oracle_br@yahoogrupos.com.br> escreveu: > > > Bem, só no verbal sem nenhum exemplinho é meio difícil de pensar, mas ao > que entendi vc quer ter dois ranges de datas e quer comparar esses dois > ranges, e verificar se há intersecção entre eles ? Se sim, dá um look em > https://asktom.oracle.com/pls/apex/f?p=100:11:0P11_QUESTION_ID:4921012347969 > que vc encontra algumas possibilidades diversas > >[]s > > Chiappa > >