Mais uma aula do Mestre Chiappa !!!!
Thiago M. Zerbinato Oracle Certified Professional Linux Professional desde 1997 Ribeirao Preto / SP --- http://thiagomz.hpg.com.br Linux User #286429 Debian User #534 "Primeiro eles o ignoram. Depois riem de voce. Entao eles o combatem. Ai voce vence" Mohandas Gandhi jlchiappa wrote: > ** Nenhuma ** necessidade de coleta de estatística só pra saber uso > de espaço, isso já é AUTOMATICAMENTE registrado nas views do sistema, > assim : > > SQL*Plus: Release 9.2.0.5.0 - Production on Seg Jan 9 09:45:20 2006 > > Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. > > > Conectado a: > Oracle9i Enterprise Edition Release 9.2.0.5.0 - Production > With the Partitioning, Oracle Label Security, OLAP and Oracle Data > Mining options > JServer Release 9.2.0.5.0 - Production > > [EMAIL PROTECTED]:SQL>create tablespace TESTE datafile 'D:\O9IR2\O9IR2 > \TESTE.DBF' size 50m autoextend on; > > Tablespace criado. > > > ==> primeiro ponto, DEPENDENDO da versão, o default é tablespace LMT > (Local-Managed Tablespace), com extents de tamanho variável > controlados pelo sistema, é o meu caso : > [EMAIL PROTECTED]:SQL>select * from dba_tablespaces where > tablespace_name='TESTE'; > > TABLESPACE_NAME BLOCK_SIZE > INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS > MAX_EXTENTS PCT_INCREASE MIN_EXTLEN STATUS CONTENTS > LOGGING FOR EXTENT_MAN ALLOCATIO PLU SEGMEN > ------------------------------ ------------------ ------------------ - > ----------------- ------------------ ------------------ -------------- > ---- ------------------ --------- --------- --------- --- ---------- - > -------- --- ------ > TESTE 8192 > 65536 1 > 2147483645 65536 ONLINE PERMANENT > LOGGING NO LOCAL SYSTEM NO MANUAL > > ==> já que é LMT, de cara em cima da qtdade que vc especificou o > banco SUBTRAI 64Kb, pra criar o bitmap de controle : veja que eu > especifiquei 50 Mb (ie, 52428800 bytes, coluna BYTES abaixo), só > obtive disponível pra mim 52363264 bytes (coluna USER_BYTES) : > > [EMAIL PROTECTED]:SQL>select * 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_BYTES USER_BLOCKS > -------------------------------------------------------------------- - > ----------------- ------------------------------ ------------------ -- > ---------------- --------- ------------------ --- ------------------ - > ----------------- ------------------ ------------------ -------------- > ---- > D:\O9IR2\O9IR2 > \TESTE.DBF > 11 TESTE 52428800 > 6400 AVAILABLE 11 YES 34359721984 > 4194302 1 52363264 6392 > > ==> vamos ver quanto tenho nunca usado, ie, totalmente disponível : > > [EMAIL PROTECTED]:SQL>l > 1 select * from dba_free_space > 2* where tablespace_name='TESTE' > [EMAIL PROTECTED]:SQL>/ > > TABLESPACE_NAME FILE_ID > BLOCK_ID BYTES BLOCKS RELATIVE_FNO > ------------------------------ ------------------ ------------------ - > ----------------- ------------------ ------------------ > TESTE 11 > 9 52363264 6392 11 > > ==>> exato e perfeito, tenho 52363264 livres, é isso mesmo ... Agora > vamos criar um objeto que consome espaço, tabela pra seguir o seu > caso : > > [EMAIL PROTECTED]:SQL>create table teste > 2 (id number) > 3 tablespace teste > 4 storage (initial 10m next 1m); > > Tabela criada. > > ==>> Aqui é que entra o CONCEITO-CHAVE pra se entender storage no bd > Oracle, que é provavelmente onde vc está falhando : pra ter sempre a > maior performance possível em INSERTs, o bd Oracle usa de vários > trucões, um deles é : quando vc cria uma objeto de banco que consome > espaço em disco (tabela, índice, o que for), nesse EXATO momento, > mesmo estando inicialmente vazio, o bd ** IMEDIATAMENTE ** já cria, > aloca e reserva dentro da tablespace o espaço inicial (o initial > extent). A vantagem disso é que quando chegarem os INSERTs, o espaço > JÀ ESTARÁ "formatado", prontinho pra usar... Trucão básico. Vamos ver > que é isso mesmo : > > [EMAIL PROTECTED]:SQL>select * from dba_free_space > 2 where tablespace_name='TESTE'; > > TABLESPACE_NAME FILE_ID > BLOCK_ID BYTES BLOCKS RELATIVE_FNO > ------------------------------ ------------------ ------------------ - > ----------------- ------------------ ------------------ > TESTE 11 > 1289 41877504 5112 11 > > é o real aqui, vc mandou o initial extent ser de 10 Mb (ie, 10485760 > bytes), é isso aí, 52363264 bytes que eu tinha livres, MENOS os > 10485760 bytes do initial extent automaticamente criado, resultam em > 41877504 bytes livres ... > > Pra vc conferir que é isso mesmo, o extent FOI criado mesmo sem > dados : > > [EMAIL PROTECTED]:SQL>select * from dba_extents where > tablespace_name='TESTE'; > > OWNER SEGMENT_NAME > PARTITION_NAME SEGMENT_TYPE > TABLESPACE_NAME EXTENT_ID > FILE_ID BLOCK_ID BYTES > BLOCKS RELATIVE_FNO > ---------------- ----------------------------------- ----------------- > ------------- ------------------ ------------------------------ ------ > ------------ ------------------ ------------------ ------------------ > ------------------ ------------------ > SYSTEM > TESTE > TABLE TESTE > 0 11 9 > 1048576 128 11 > SYSTEM > TESTE > TABLE TESTE > 1 11 137 > 1048576 128 11 > SYSTEM > TESTE > TABLE TESTE > 2 11 265 > 1048576 128 11 > SYSTEM > TESTE > TABLE TESTE > 3 11 393 > 1048576 128 11 > SYSTEM > TESTE > TABLE TESTE > 4 11 521 > 1048576 128 11 > SYSTEM > TESTE > TABLE TESTE > 5 11 649 > 1048576 128 11 > SYSTEM > TESTE > TABLE TESTE > 6 11 777 > 1048576 128 11 > SYSTEM > TESTE > TABLE TESTE > 7 11 905 > 1048576 128 11 > SYSTEM > TESTE > TABLE TESTE > 8 11 1033 > 1048576 128 11 > SYSTEM > TESTE > TABLE TESTE > 9 11 1161 > 1048576 128 11 > > > e antes que vc pergunte, porque ele criou 10 extents de 1Mb ?? É que > vc pediu por 10 Mb, MAS como mostrado no select anterior da > dba_tablespaces, no meu bd se eu não especificar a tablespace é > SYSTEM-allocated, é o caso, e esse tipo de tablespace funciona assim, > ela primeiro tenta dividir o espaço pedido em 64 Kb, em não dando vai > pra 1 Mb, daí pra 64 Mb... No caso, 10 Mb ela dividiu em 10 extents > de 1 Mb, é isso. > > ==> Então a sua resposta é : pra vc ver o que está EFETIVAMENTE > livre, é consultar a DBA_FREE_SPACE, e pra vc ver o que está > reservado, é consultar a DBA_EXTENTS, é isso. A última informação que > vc pode querer é, dentro desse espaço reservado, QUANTO já foi > efetivamente preenchido com dados/usado, e quanto ainda não ? Isso vc > obtém com a package DBMS_SPACE, um script pra a consultar poderia ser > o abaixo, que eu adaptei dum original de Tom Kyte, em > http://asktom.oracle.com > > []s > > Chiappa > > -- =============================================== > accept type prompt "Enter the TYPE of segment to check > (i=index, t=table) : " > accept obj_owner prompt "Enter the OWNER of the object to > check .............. : " > accept obj_name prompt "Enter the NAME of the object to > check ............... : " > set serveroutput on size 1000000 > set feedback off > -- > DECLARE > v_total_blocks NUMBER; > v_total_bytes NUMBER; > v_unused_blocks NUMBER; > v_unused_bytes NUMBER; > v_file_id NUMBER; > v_block_id NUMBER; > v_last_block NUMBER; > v_used NUMBER; > v_owner VARCHAR2(12); > v_segment VARCHAR2(80); > v_type VARCHAR2(6); > > BEGIN > select DECODE(upper('&type'), 'I', 'INDEX', 'TABLE') into v_type > from dual; > v_owner := upper('&obj_owner'); > v_segment := upper('&obj_name'); > -- > DBMS_SPACE.UNUSED_SPACE(v_owner, v_segment, v_type, v_total_blocks, > v_total_bytes, > v_unused_blocks, v_unused_bytes, > v_file_id, v_block_id, v_last_block); > -- > DBMS_OUTPUT.PUT_LINE(CHR(10)); > DBMS_OUTPUT.PUT_LINE('======== Ocupação do Espaço ======='); > DBMS_OUTPUT.PUT_LINE('Index Name = '||v_segment); > DBMS_OUTPUT.PUT_LINE('Total Blocks > = '||v_total_blocks); > DBMS_OUTPUT.PUT_LINE('Total Bytes > = '||v_total_bytes); > DBMS_OUTPUT.PUT_LINE('Unused (Free) Blocks > = '||v_unused_blocks); > DBMS_OUTPUT.PUT_LINE('Unused (Free) Bytes > = '||v_unused_bytes); > v_used := v_total_blocks - v_unused_blocks; > DBMS_OUTPUT.PUT_LINE('Used Blocks = '||v_used); > v_used := v_total_bytes - v_unused_bytes; > DBMS_OUTPUT.PUT_LINE('Used Bytes = '||v_used); > DBMS_OUTPUT.PUT_LINE('Last used extents file id = '||v_file_id); > DBMS_OUTPUT.PUT_LINE('Last used extents block id = '||v_block_id); > DBMS_OUTPUT.PUT_LINE('Last used block > = '||v_last_block); > DBMS_OUTPUT.PUT_LINE > ('============================================='); > END; > / > set serveroutput off > set feedback on > > > > > --- Em oracle_br@yahoogrupos.com.br, Marcus Vinicius Miguel Pedro > <[EMAIL PROTECTED]> escreveu > >>Olá pessoal, tudo bom?! >> >> Estou com uma dúvida quanto ao espaço livre nos tablespaces. >> >> Vamos lá: >> >> SQL> create tablespace teste >> 2 datafile '/oracle/oradata13/teste.dbf' >> 3 size 50m >> 4 autoextend on; >> Tablespace created. >> >> SQL> create table teste >> 2 (id number) >> 3 tablespace teste >> 4 storage (initial 10m next 1m); >> Table created. >> >> Tablespace e tabela criadas. Até aí beleza... >> >> A questão é, não populei nada ainda na tabela correto? Ou seja, > > mesmo especificando que a extensão inicial ocupará 10M, fisicamente > não há nada de dados na extensão. > >> >> SQL> select bytes/1024/1024 tam_mb,tablespace_name >> 2 from dba_free_space >> 3 where tablespace_name='TESTE'; >> >> TAM_MB TABLESPACE_NAME >>------------ ---------------------------------- >>39.9375 TESTE >> >> >> A dúvida é, existe alguma maneira onde eu consiga *realmente* > > saber quanto de espaço eu tenho ocupado na minha tablespace??! Sei > que se rodar o analyze table eu consigo algo, mas não quero e não > posso rodar estatísticas... > >> >> Um abraço >> >> Vinicius >> >> >> >> >>--------------------------------- >> Yahoo! doce lar. Faça do Yahoo! sua homepage. >> >>[As partes desta mensagem que não continham texto foram removidas] >> > > > > > > > > -------------------------------------------------------------------------------------------------------------------------- > 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/ > --------------------------------------------------------------------------------------------------------------------------_____________________________________________________________________ > Area de download do grupo - http://www.4shared.com/dir/101727/a4dcc423 > Links do Yahoo! Grupos > > > > > > > > > __________ NOD32 1.1356 (20060108) Information __________ > > This message was checked by NOD32 antivirus system. > http://www.eset.com > > > _______________________________________________________ Yahoo! doce lar. Faça do Yahoo! sua homepage. http://br.yahoo.com/homepageset.html -------------------------------------------------------------------------------------------------------------------------- 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/ --------------------------------------------------------------------------------------------------------------------------_____________________________________________________________________ Area de download do grupo - http://www.4shared.com/dir/101727/a4dcc423 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