Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: used space
Forum PHP.pl > Forum > Bazy danych > Oracle
gkoti
witam.


nie jestem zbytnio doswiadczony w tym ale..:

mam zalozony schemat w oracle 10g, kilka tabelek, potrzebuje zbadac ile one zajmuja miejsca. jest mi to potrzebne do sprawdzenia roznicy zajmowanego miejsca po konwersji bazy z ansi1250 do utf8.


za odpowiedzi dzieki.

a moze ktos ma na to jakis skrypcik ??bylbym wdzieczny bardzo...

pozdrawiam
SongoQ
Tylko ze kodowanie ma tez wplyw na wielkosc. Nie wiem czy Ci cos to da.
gkoti
nie no kumam ale wlasnie o to chodzi ze musze sprawdzic to przed kodowanie i po kodowaniu i nie wiem za bardzo jak...to ma byc maly wykresik na podstawie sprawdzenia do pracy zrobiony;/
LBO
Jak dla mnie to nie ma sensu... Chyba, że chodzi Tobie o pusta bazę. W przeciwnym wypadku, wielkość bazy nie ma jakiejś stałego przyrostu po zmianie kodowania. To wszystko zależy od wprowadzonych danych - mozna to jedynie oszacować. W tym tekście zostało napisane:
Cytat
Tekst w języku polskim zwiększa swoją objętość o ok. 5%, ale za to nie ma potrzeby stosowania encji do znaków specjalnych jak np. " " i "—"
SongoQ
Mozesz np z dba_segments.
gkoti
nie no dla mnie ma jak najbardziej znaczenie i to duze - chodzi mi o to:
mam wypelniona baze danych w kodowaniu ANSI1250, kilka tabel po 50 rekordow. sprawdzam zajetosc miejsca przez te dane. konwertuje baze i sprawdzam czy wystapila roznica w zajetosci miejsca...
notuje wnioski i umieszczam w mojej pracy. to jest potrzebne mi jak najbardziej do pracy inzynierskiej..
wszystko mam juz gotowe tylko mi brakuje tego a nie bardzo wiem jak to zrobic i dlatgeo zadalem tego posta...

nie czekam na opinie czy to ma sens czy nie tylko na jakies podpowiedzi odnosnie rozwiazania tego problemu i otrzymania wnioskow na ktore czekam.


pozdraiwam
SongoQ
@LBO Glupoty gadasz. Po kolejnym przeczytaniu pytania dopiero zrozumialem co autor mial na mysli.

Jesli to bedziesz wykorzystywal do cyklicznych operacji i chcesz badac przyrost wyciagany z schematu to pasowalo by zbydowac dodatkowa tabele i wrzucac te dane jakims jobsem. To co podalem powyzej nie zwroci Ci calkowitej fizycznej przestrzeni, niestety nie doszukalem sie jak cos takiego zrobic, chyba ze poprostu z systemu odczytasz ale to za duzo zabawy jest.
gkoti
nie, chce tylko raz sprawdzic jak wplywa kodowanie na moja ilosc danych ktore mam zawarte w bazie i na tej podstawie sporzadzic wnioski z tego zadania i ujac je w pracy...juz myslalem nad DBA_FREE_SPACE, to jest widok z 9i i nie wiem czy jest on takze w 10g R2
SongoQ
Tak jest, masz tutaj przyklady jak i inne wykorzystania tego polecenia.

http://forums.oracle.com/forums/thread.jsp...30&#1621530
gkoti
fajnie dzieki, ale takie male pytanko:
mianowicie uzywam tablespace USER, tymczasowa to TEMP. czy miejsce zajmowane przez moje dane dokladnie bedzie odzwierciedlone przez zliczenie zajetego miejsca na tej przestrzeni tabel.

nie mam w niej zadnych innych tabel, schematow itp. generalnie w bazie sa tylko moje tabelki i sa one w tej przestrzeni i nie ma nic poza tym.

chodzi mi o to czy czasem nie bede mial zliczonych zadnych smieci do zjamowanego miejsca....


dzieki
SongoQ
Nie jestem pewny ale bedziesz mial inne rzeczy. Musisz pewnie kryteria dac na odpowiednie obiekty. Przegladnij sobie dokladnie i pokrewne tematy z tego forum co Ci wczesniej podalem.

Mozesz jeszcze zliczac z segmentow tak jak pisalem wczesniej. Tez na forum znajdziesz przyklady.
gkoti
hmm...ok...wiec zabieram sie za grzebanko w tym...jak cos nie zaQmam to bede pytal..dzieki za odpowiedzi smile.gif
SongoQ
Jesli uda Ci sie cos ciekawego zaimplementowac wrzuc na forum, mozliwe ze komus sie to w przyszlosci przyda.
gkoti
wymyslilem cos takego...
  1. DECLARE
  2. przestrzen VARCHAR2(100);
  3. bloks dba_segments.blocks%TYPE;
  4. seg NUMBER;
  5. uzytkownik VARCHAR2(50);
  6. segmenttyp VARCHAR2(50);
  7. CURSOR space_check IS SELECT DISTINCT ddf.tablespace_name, total totalSize, (total-NVL(wolne,0)) uzyte, wolne, block_size
  8. FROM (SELECT tablespace_name,SUM(bytes) total FROM dba_data_files GROUP BY tablespace_name) ddf,
  9. (SELECT tablespace_name,SUM(bytes) wolne FROM dba_free_space GROUP BY tablespace_name) dfs,
  10. dba_tablespaces
  11. WHERE ddf.tablespace_name = dfs.tablespace_name(+) AND ddf.tablespace_name = przestrzen;
  12. r_space_check space_check%ROWTYPE;
  13.  
  14. BEGIN uzytkownik:='gkoti'; --deklaracja nazwy uzytkownika
  15. segmenttyp:='table'; --deklaracja typu obiektu segmentu
  16. SELECT DISTINCT tablespace_name, blocks INTO przestrzen, bloks
  17. FROM dba_segments WHERE LOWER(owner) LIKE uzytkownik AND LOWER(segment_type) LIKE segmenttyp;
  18. OPEN space_check;
  19. LOOP
  20. FETCH space_check INTO r_space_check; EXIT WHEN space_check%NOTFOUND;
  21. seg:=(r_space_check.totalSize/(bloks*r_space_check.block_size));
  22. DBMS_OUTPUT.PUT_LINE('Program ma na celu pokazanie zajętego miejsca przez dane w tabelach');
  23. DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------');
  24. DBMS_OUTPUT.PUT_LINE('Użytkownik: '||uzytkownik);
  25. DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------');
  26. DBMS_OUTPUT.PUT_LINE('Przestrzeń tabel: '||r_space_check.tablespace_name);
  27. DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------');
  28. DBMS_OUTPUT.PUT_LINE('Typ segmentów dla obiektów: '||segmenttyp);
  29. DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------');
  30. DBMS_OUTPUT.PUT_LINE('Rozmiar przestrzeni tabel: '||r_space_check.totalSize||' bajtów');
  31. DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------');
  32. DBMS_OUTPUT.PUT_LINE('Zajęte miejsce w przestrzeni: '||r_space_check.uzyte||' bajtów');
  33. DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------');
  34. DBMS_OUTPUT.PUT_LINE('Wolne miejsce w przestrzeni: '||r_space_check.wolne||' bajtów');
  35. DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------');
  36. DBMS_OUTPUT.PUT_LINE('Ilość segmentów w przestrzeni: '||seg);
  37. DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------');
  38. DBMS_OUTPUT.PUT_LINE('Ilość bloków: '||bloks);
  39. DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------');
  40. DBMS_OUTPUT.PUT_LINE('Rozmiar bloku w segmencie: '||r_space_check.block_size||' bajtów');
  41. DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------');
  42. END LOOP;
  43. CLOSE space_check;
  44. END;


po czesci gdzies troszke podejrzane po czesci dopisane przeze mnie smile.gif

czy to napewno nie pokazalo mi smieci questionmark.gif wynik ponizej :
  1. Program ma na celu pokazanie zajętego miejsca przez dane w tabelach
  2. -------------------------------------------------------------------
  3. Użytkownik: gkoti
  4. -------------------------------------------------------------------
  5. Przestrzeń tabel: USERS
  6. -------------------------------------------------------------------
  7. Typ segmentów dla obiektów: table
  8. -------------------------------------------------------------------
  9. Rozmiar przestrzeni tabel: 5242880 bajtów
  10. -------------------------------------------------------------------
  11. Zajęte miejsce w przestrzeni: 786432 bajtów
  12. -------------------------------------------------------------------
  13. Wolne miejsce w przestrzeni: 4456448 bajtów
  14. -------------------------------------------------------------------
  15. Ilość segmentów w przestrzeni: 80
  16. -------------------------------------------------------------------
  17. Ilość bloków: 8
  18. -------------------------------------------------------------------
  19. Rozmiar bloku w segmencie: 8192 bajtów
  20. -------------------------------------------------------------------


podejzyjcie i pomyslcie i ocencie plissss smile.gif

Dokonałem wersji finalnej zliczajacej bajty w kazdej kolumnie tabeli - oto kod (może sie komus jeszcze przyda):
  1. DECLARE
  2. CURSOR c_col1 IS SELECT table_name FROM USER_TAB_COLUMNS; r_c_col1 c_col1%ROWTYPE;
  3. ------------------------
  4. CURSOR c_col2(tabelka VARCHAR2) IS SELECT column_name FROM USER_TAB_COLUMNS WHERE table_name = tabelka;
  5. r_c_col2 c_col2%ROWTYPE;
  6. ------------------------
  7. TYPE KURSOR IS REF CURSOR;
  8. z_kursor KURSOR;
  9. r_z_kursor NUMBER(10);
  10. dl NUMBER(10);
  11. zm_sql VARCHAR2(1000);
  12. BEGIN DBMS_OUTPUT.ENABLE(1000000);
  13. dl:=0;
  14. OPEN c_col1;
  15. LOOP
  16. FETCH c_col1 INTO r_c_col1; EXIT WHEN c_col1%NOTFOUND;
  17. DBMS_OUTPUT.PUT_LINE('Tabela : '||r_c_col1.table_name);
  18. OPEN c_col2(r_c_col1.table_name);
  19. LOOP
  20. FETCH c_col2 INTO r_c_col2; EXIT WHEN c_col2%NOTFOUND;
  21. DBMS_OUTPUT.PUT_LINE('Kolumna : '||r_c_col2.column_name);
  22. zm_sql:='SELECT LENGTHB('||r_c_col2.column_name||') from '||r_c_col1.table_name; OPEN z_kursor FOR zm_sql;
  23. LOOP
  24. FETCH z_kursor INTO r_z_kursor; EXIT WHEN z_kursor%NOTFOUND;
  25. dl:=dl+r_z_kursor;
  26. DBMS_OUTPUT.PUT_LINE('Długość: '||r_z_kursor||'b');
  27. END LOOP;
  28. CLOSE z_kursor;
  29. END LOOP;
  30. CLOSE c_col2;
  31. END LOOP;
  32. CLOSE c_col1;
  33. DBMS_OUTPUT.PUT_LINE('--------------------------------------------------------------------------------------------');
  34. DBMS_OUTPUT.PUT_LINE('Zajmowane miejsce przez dane w tabelach: '||dl||' bajtów');
  35. DBMS_OUTPUT.PUT_LINE('--------------------------------------------------------------------------------------------');
  36. END;


działa na małej ilości tabel - można wyłączyc wypisywanie bajtow z kazdej kolumny i bedzie git smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.