[oracle_br] Re: Oracle Concepts - Documento
--- Em oracle_br@yahoogrupos.com.br, Marcelo Cauduro [EMAIL PROTECTED] escreveu Pessoal, Lendo o Oracle Concepts Part II, Chapter 2 and 3, fiquei com as seguintes dúvidas : Um segmento é só para um objeto certo ? Um segmento = um objeto ** lógico **, ou seja, um item que possui storage. Por exemplo, 1 tabela simples (heap table) = 1 objeto lógico = 1 segmento, mas para tabelas particionadas é CADA PARTIÇÃO = 1 objeto lógico = 1 segmento, já que cada partição pode ser fisicamente diferente, alocada em locais e formas diferentes. Quando você apaga linhas de uma tabelas, os extents de um determinado segmento que continham essas linhas nâo sâo liberados para novas linhas ? São automaticamente liberados pra novas linhas, MAS desde que seja insert na mesma tabela. Há alguma excessao ? Não, em sendo tabelas e índices comuns. Pelo que li ele só são liberados quando uma nova insercao é feita, Incorreto : assim que as qtdades de deleções num bloco ultrapassam o especificado em PCTFREE, e sempre respeitando PCTUSED, o bloco vai pra lista de blocos livres, está LIBERADO pra reuso, e será TRANQUILAMENTE reusado quando for necessário, SEJA pra INSERTs, SEJA pra UPDATEs que ultrapassaram o espaço atual. que isto naum é feito na hora da exclusao ? É feito, mas o conceito aqui é : pra se obter a melhor performance possível em INSERTs/UPDATEs, assim que a tabela é criada, mesmo estando VAZIA, o banco já aloca um extent pra ela, e conforme vão ocorrendo novos INSERTs/UPDATEs que precisem de espaço, novos extents vão sendo alocados pra tabela. A chave aqui é, já que na maioria das vezes num banco de dados ativo a maioria das tabelas são dinâmicas (ie, hoje cresceu, daqui a pouco já tem deleção, logo depois tem novas inserções) pra poupar tempo e ganhar performance o banco considera TODO o espaço alocado pra um segmento como pertencente a ele, quando há deleções ou DMLs que livrem espaço, o espaço é livre MAS é espaço livre para uso DESSE segmento dono, é isso : assim, o banco se poupa o trabalho de ter que alocar novos extents. É por isso que tabelas de transação, que só crescem num job tipo fim de mês, e crescem aleatoriamente, muitas vezes até diminuindo em muito de tamanho, se desejado reaproveitamento desse espaço por OUTRAS tabelas, em princípio deveriam ser TRUNCADAS, aí sim o espaço livre delas fica disponível pra qquer outro segmento do banco, com exceção do extent inicial. []s Chiappa -- Atenção! As mensagens deste grupo são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ --__ Moderador e Fundador: Dorian Anderson Soutto [EMAIL PROTECTED] __ Links do Yahoo! Grupos * Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/oracle_br/ * Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] * O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html
[oracle_br] Re: Oracle Concepts - Documento
--- Em oracle_br@yahoogrupos.com.br, Marcelo Cauduro [EMAIL PROTECTED] escreveu Muito legal Chiapa, mas fica a dúvida, pelo que entendi... sempre qndo faço um delete ou mesmo um update para null value e os parametros pctused e pctfree estiverem ok, ou seja, tiver espaco livre maior que pctfree por exemplo, os extents do segmento que tinham as linhas que foi removida, ou até todo o segmento, dependendo do volume do delete/update, fica livre na hora... Espaço liberado por DELETE/UPDATE ficam imediatamente disponíveis, sim, mas ** APENAS ** pro objeto que os liberou, a idéia sempre é : espaço alocado prum segmento, SEMPRE fica pertencente a esse segmento, quando ficar vazio vai ser usado APENAS por esse segmento. Só quando o segmento liberar esse espaço pro banco de modo geral (com um TRUNCATE, DROP, ou similar) é que aí sim esse espaço passa a ser público, entra na DBA_FREE_SPACE, e aí sim qquer um pode o utilizar... mas é ai que surge minha dúvida... lendo o concepts aprendi o conceito da high water mark ou marca d'agua, que seria o limite entre os blocos usados e não usados, ou seja, ela indica o ultimo bloco usado na tabela, não, não é isso : hwm não é por tabela, é por arquivo : é o espaço além do último bloco já usado por algum segmento nessa tablespace : vc pode ter N tabelas/índices numa tablespace, HWM é o espaço além do último bloco já usado, não importa por qual dos N segmentos que usam a tablespace... mas quando se faz delete, pelo que entendi, essa marca d'gua não é restabelecida, - isso não afetaria a liberação dos extents ?? É o mesmo acima dito : quando vc faz DELETE, o espaço vai CONTINUAR reservado pra uso exclusivo do segmento dono dele , então não, não baixa HWM. - ou essa marca é usada apenas para quando o Oracle vai recuperar os dados, ou seja, ele le todos os blocos até a high water mark, não afetando os updates/deletes ? Na verdade,uma leitura que precise recuperar todos os blocos dum segmento (tipicamente o table full scan), ocorre da seguinte maneira : o full scan significa ir pra DBA_EXTENTs, achar o datafile e o bloco de início do primeiro extent marcado como pertencente ao segmento em questão, ler esse extent, ler o próximo, próximo, até não haver mais extents. Ora, imagine que nesse segmento vc tinha 1 milhão de registros, e vc fez um DELETE de todos eles : como acima dito, após o DELETE o espaço VAI continuar alocado pro segmento, os extents VÂO continuar lá (vazios, serão re-usados no próximo INSERT, mas estão lá), então um eventual scan VAI ler todos esses segmentos, mesmo estando vazios, é isso... Se houver a liberação desse espaço pro banco (via truncate/drop/o que for), o hwm baixa, sim, MAS o full table scan não vai mais os ler não é só porque o hwm baixou, mas sim porque NÃO há mais extents apontando pra essa área, a leitura é controlada por extents. É por isso, inclusive, que tamanhos de extents PODEM influenciar DIRETAMENTE na performance de scans, eu fiz uma demonstração maior disso no meu paper da ENPO de 2004. == vamos tentar um exemplo desses conceitos, banco com blocksize de 8192 bytes, tablespace LMT com esse mesmo blocksize : [EMAIL PROTECTED]:SQLselect * from dba_tablespaces where tablespace_name='TESTE'; TABLESPACE_NAMEBLOCK_SIZE INITIAL_EXTENTNEXT_EXTENTMIN_EXTENTS MAX_EXTENTS PCT_INCREASE MIN_EXTLEN STATUSCONTENTS LOGGING FOR EXTENT_MAN ALLOCATIO PLU SEGMEN -- -- -- - - -- -- -- -- - - - --- -- - --- -- TESTE8192 65536 1 2147483645 65536 ONLINEPERMANENT LOGGING NO LOCAL SYSTEMNO MANUAL [EMAIL PROTECTED]:SQLselect * from dba_data_files where tablespace_name='TESTE'; FILE_NAME FILE_ID TABLESPACE_NAME BYTES BLOCKS STATUS RELATIVE_FNO AUT MAXBYTES MAXBLOCKS INCREMENT_BY USER_BYTESUSER_BLOCKS - - -- -- -- - -- --- -- - - -- -- -- D:\O9IR2\O9IR2 \TESTE.DBF 11 TESTE52428800 6400 AVAILABLE 11 YES34359721984 4194302 1 52363264 6392 [EMAIL PROTECTED]:SQLselect * from dba_free_space where
Re: [oracle_br] Re: Oracle Concepts - Documento
essa high water mark me confundiu... ela é verificada em inserts e updates ? Por que se sim, e se quando eu deleto eu libero linha mas ela fica no me mesmo lugar... eu não iria reusar os blocos livres por meio do espaço deixado com os deletes... On 1/23/06, Marcelo Cauduro [EMAIL PROTECTED] wrote: Muito legal Chiapa, mas fica a dúvida, pelo que entendi... sempre qndo faço um delete ou mesmo um update para null value e os parametros pctused e pctfree estiverem ok, ou seja, tiver espaco livre maior que pctfree por exemplo, os extents do segmento que tinham as linhas que foi removida, ou até todo o segmento, dependendo do volume do delete/update, fica livre na hora... mas é ai que surge minha dúvida... lendo o concepts aprendi o conceito da high water mark ou marca d'agua, que seria o limite entre os blocos usados e não usados, ou seja, ela indica o ultimo bloco usado na tabela, mas quando se faz delete, pelo que entendi, essa marca d'gua não é restabelecida, - isso não afetaria a liberação dos extents ?? - ou essa marca é usada apenas para quando o Oracle vai recuperar os dados, ou seja, ele le todos os blocos até a high water mark, não afetando os updates/deletes ? On 1/23/06, jlchiappa [EMAIL PROTECTED] wrote: --- Em oracle_br@yahoogrupos.com.br, Marcelo Cauduro [EMAIL PROTECTED] escreveu Pessoal, Lendo o Oracle Concepts Part II, Chapter 2 and 3, fiquei com as seguintes dúvidas : Um segmento é só para um objeto certo ? Um segmento = um objeto ** lógico **, ou seja, um item que possui storage. Por exemplo, 1 tabela simples (heap table) = 1 objeto lógico = 1 segmento, mas para tabelas particionadas é CADA PARTIÇÃO = 1 objeto lógico = 1 segmento, já que cada partição pode ser fisicamente diferente, alocada em locais e formas diferentes. Quando você apaga linhas de uma tabelas, os extents de um determinado segmento que continham essas linhas nâo sâo liberados para novas linhas ? São automaticamente liberados pra novas linhas, MAS desde que seja insert na mesma tabela. Há alguma excessao ? Não, em sendo tabelas e índices comuns. Pelo que li ele só são liberados quando uma nova insercao é feita, Incorreto : assim que as qtdades de deleções num bloco ultrapassam o especificado em PCTFREE, e sempre respeitando PCTUSED, o bloco vai pra lista de blocos livres, está LIBERADO pra reuso, e será TRANQUILAMENTE reusado quando for necessário, SEJA pra INSERTs, SEJA pra UPDATEs que ultrapassaram o espaço atual. que isto naum é feito na hora da exclusao ? É feito, mas o conceito aqui é : pra se obter a melhor performance possível em INSERTs/UPDATEs, assim que a tabela é criada, mesmo estando VAZIA, o banco já aloca um extent pra ela, e conforme vão ocorrendo novos INSERTs/UPDATEs que precisem de espaço, novos extents vão sendo alocados pra tabela. A chave aqui é, já que na maioria das vezes num banco de dados ativo a maioria das tabelas são dinâmicas (ie, hoje cresceu, daqui a pouco já tem deleção, logo depois tem novas inserções) pra poupar tempo e ganhar performance o banco considera TODO o espaço alocado pra um segmento como pertencente a ele, quando há deleções ou DMLs que livrem espaço, o espaço é livre MAS é espaço livre para uso DESSE segmento dono, é isso : assim, o banco se poupa o trabalho de ter que alocar novos extents. É por isso que tabelas de transação, que só crescem num job tipo fim de mês, e crescem aleatoriamente, muitas vezes até diminuindo em muito de tamanho, se desejado reaproveitamento desse espaço por OUTRAS tabelas, em princípio deveriam ser TRUNCADAS, aí sim o espaço livre delas fica disponível pra qquer outro segmento do banco, com exceção do extent inicial. []s Chiappa -- Atenção! As mensagens deste grupo são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ --__ Moderador e Fundador: Dorian Anderson Soutto [EMAIL PROTECTED] __ *Yahoo! Grupos, um serviço oferecido por:* PUBLICIDADE http://br.rd.yahoo.com/SIG=12f3ff9ka/M=365837.7000707.7924794.2369893/D=brclubs/S=2137114689:HM/Y=BR/EXP=1138019872/A=2950750/R=2/id=noscript/SIG=10tift5qr/*http://br.movies.yahoo.com/ -- *Links do Yahoo! Grupos* - Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/oracle_br/ - Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] [EMAIL PROTECTED] - O uso que
[oracle_br] Re: Oracle Concepts - Documento
É como eu falei na msg anterior : quando vc faz um INSERT/UPDATE normal (UPDATE pensando num caso de valor que não cabe no bloco), o algoritmo é algo tipo : passo 1 : existe espaço vazio e reservado pro segmento que está sendo inserido/updateado ? Se existe, uso-o... passo 2 : se 1 falhou, olhar na DBA_FREE_SPACE, existe espaço livre geral a alocar abaixo da HWM ? Se sim, uso e o removo da dba_free_space... passo 3 : 1 e 2 falharam, existe espaço na DBA_FREE_SPACE acima da hwm ?? Se sim, formato o quanto eu preciso desses blocos acima da HWM, uso-os e os removo da dba_free_space, e avanço a hwm mais pra cima... É basicamente isso. Quanto ao porque do espaço não ser liberado após um DELETE, é o que eu disse ma msg anterior, o espaço uma vez alocado prum segmento PERMANECE como propriedade exclusiva desse segmento até o segmento o liberar com TRUNCATE (caso em que o initial ainda permanece), ou que haja um DROP, quando aí não permanece mais nada. []s Chiappa --- Em oracle_br@yahoogrupos.com.br, Marcelo Cauduro [EMAIL PROTECTED] escreveu essa high water mark me confundiu... ela é verificada em inserts e updates ? Por que se sim, e se quando eu deleto eu libero linha mas ela fica no me mesmo lugar... eu não iria reusar os blocos livres por meio do espaço deixado com os deletes... On 1/23/06, Marcelo Cauduro [EMAIL PROTECTED] wrote: Muito legal Chiapa, mas fica a dúvida, pelo que entendi... sempre qndo faço um delete ou mesmo um update para null value e os parametros pctused e pctfree estiverem ok, ou seja, tiver espaco livre maior que pctfree por exemplo, os extents do segmento que tinham as linhas que foi removida, ou até todo o segmento, dependendo do volume do delete/update, fica livre na hora... mas é ai que surge minha dúvida... lendo o concepts aprendi o conceito da high water mark ou marca d'agua, que seria o limite entre os blocos usados e não usados, ou seja, ela indica o ultimo bloco usado na tabela, mas quando se faz delete, pelo que entendi, essa marca d'gua não é restabelecida, - isso não afetaria a liberação dos extents ?? - ou essa marca é usada apenas para quando o Oracle vai recuperar os dados, ou seja, ele le todos os blocos até a high water mark, não afetando os updates/deletes ? On 1/23/06, jlchiappa [EMAIL PROTECTED] wrote: --- Em oracle_br@yahoogrupos.com.br, Marcelo Cauduro [EMAIL PROTECTED] escreveu Pessoal, Lendo o Oracle Concepts Part II, Chapter 2 and 3, fiquei com as seguintes dúvidas : Um segmento é só para um objeto certo ? Um segmento = um objeto ** lógico **, ou seja, um item que possui storage. Por exemplo, 1 tabela simples (heap table) = 1 objeto lógico = 1 segmento, mas para tabelas particionadas é CADA PARTIÇÃO = 1 objeto lógico = 1 segmento, já que cada partição pode ser fisicamente diferente, alocada em locais e formas diferentes. Quando você apaga linhas de uma tabelas, os extents de um determinado segmento que continham essas linhas nâo sâo liberados para novas linhas ? São automaticamente liberados pra novas linhas, MAS desde que seja insert na mesma tabela. Há alguma excessao ? Não, em sendo tabelas e índices comuns. Pelo que li ele só são liberados quando uma nova insercao é feita, Incorreto : assim que as qtdades de deleções num bloco ultrapassam o especificado em PCTFREE, e sempre respeitando PCTUSED, o bloco vai pra lista de blocos livres, está LIBERADO pra reuso, e será TRANQUILAMENTE reusado quando for necessário, SEJA pra INSERTs, SEJA pra UPDATEs que ultrapassaram o espaço atual. que isto naum é feito na hora da exclusao ? É feito, mas o conceito aqui é : pra se obter a melhor performance possível em INSERTs/UPDATEs, assim que a tabela é criada, mesmo estando VAZIA, o banco já aloca um extent pra ela, e conforme vão ocorrendo novos INSERTs/UPDATEs que precisem de espaço, novos extents vão sendo alocados pra tabela. A chave aqui é, já que na maioria das vezes num banco de dados ativo a maioria das tabelas são dinâmicas (ie, hoje cresceu, daqui a pouco já tem deleção, logo depois tem novas inserções) pra poupar tempo e ganhar performance o banco considera TODO o espaço alocado pra um segmento como pertencente a ele, quando há deleções ou DMLs que livrem espaço, o espaço é livre MAS é espaço livre para uso DESSE segmento dono, é isso : assim, o banco se poupa o trabalho de ter que alocar novos extents. É por isso que tabelas de transação, que só crescem num job tipo fim de mês, e crescem aleatoriamente, muitas vezes até diminuindo em muito de tamanho, se desejado reaproveitamento desse espaço por OUTRAS tabelas, em princípio deveriam ser TRUNCADAS, aí sim o espaço livre delas fica disponível pra qquer outro segmento do banco, com exceção do extent