[oracle_br] Re: Oracle Concepts - Documento

2006-01-23 Por tôpico jlchiappa
--- 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

2006-01-23 Por tôpico jlchiappa
--- 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

2006-01-23 Por tôpico Marcelo Cauduro
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

2006-01-23 Por tôpico jlchiappa
É 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