[Oracle] Hoe opvragen hoegroot 1 record is?

Pagina: 1
Acties:
  • 126 views sinds 30-01-2008
  • Reageer

  • Hu9o
  • Registratie: Mei 2001
  • Laatst online: 09:08

Hu9o

Schokkend

Topicstarter
hallo,

Ik wil weten hoeveel bytes 1 record van een tabel in neemt.
de tabel ziet er ongeveer zo uit:
code:
1
2
3
4
5
SQL> desc Test;
 Name                   Null?    Type
 ------------------------------- -------- ----
 ID                 NOT NULL NUMBER
 BLAAT                 NOT NULL VARCHAR2(10)

Het probleem is dat Oracle zelf bepaald HOE hij een getal in de kolom ID opslaat (SMALLINT of INTEGER). Hetzelfde geldt voor de kolom ID. Als ik maar 1 single byte karakter opsla, wordt er maar 1 Byte van de 10 opgeslagen. Dit verschilt dus per regel.

Hierdoor kan ik dus nooit bepalen hoeveel bytes 1 regel precies in beslag neemt. Want er moet dus OOK worden opgeslagen hoe de waarde is opgeslagen.

Weet iemand misschien hoe ik kan bepalen hoeveel byte 1 regel van een tabel in beslag neemt.

Alvast bedankt.

>>>>>>>>>>>>>>>>>>>>>>>>>Vertel Microsoft over dit probleem <<<<<<<<<<<<<<<<<<<<<<<<<


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Staan er niet mooie formules op de site van oracle :?

bij mysql is het voor varchars bijv "length of text + 4" bytes.
Postgres ook zoiets, dus oracle waarschijnlijk ook wel ;)

  • Hu9o
  • Registratie: Mei 2001
  • Laatst online: 09:08

Hu9o

Schokkend

Topicstarter
Ik heb d'r naar gezocht, maar ik kan ze er niet vinden. Heb jij misschien een link ernaar toe?

>>>>>>>>>>>>>>>>>>>>>>>>>Vertel Microsoft over dit probleem <<<<<<<<<<<<<<<<<<<<<<<<<


Verwijderd

In Oracle heb je ook de mogelijkheid een integer te gebruiken, zo kan je de lengte van een variabele opgeven. Ook decimalen is geen probleem

Verwijderd

Lijkt me sowieso niet onverstandig om de lengte van een number mee te geven, en het aantal decimalen.
Dus number( 38), number( 12, 5).
In de handleidingen van Oracle staan ongetwijfeld de formules om de lengte in bytes te berekenen.

Online: http://download-uk.oracle.com/otndoc/oracle9i/901_doc/index.htm
http://download-uk.oracle.com/otndoc/oracle9i/901_doc/nav/docindex.htm

  • 80000
  • Registratie: Januari 2002
  • Laatst online: 17:09

80000

mrox

Voor je tekstvelden, bedenk even welke character set je gebruikt. Oracle support variable-width multibyte character set.

  • Hu9o
  • Registratie: Mei 2001
  • Laatst online: 09:08

Hu9o

Schokkend

Topicstarter
Volgends mij hebben jullie de vraag niet helemaal begrepen. Ik zal het nog eens uitleggen.

Ik heb een bestaande database, die is een keer helemaal vol geweest. Toen heb ik een helezooi eruit gehaald. Dus nu is hij weer behoorlijk leeg. Maar omdat alle extends zijn gebruikt (van die keer dat hij helemaal vol zat) kan ik niet bepalen hoevol de database nu is.

Ik kan wel op vragen hoeveel records de tabellen bevatten. Als ik dan weer hoeveel bytes 1 record in beslag neemt. Kan ik dus ook bepalen hoeveel bytes er in de database zitten.

Maar HOE bepaal ik hoeveel ruimte er voor 1 record wordt opgeslagen. Dit is moeilijk, omdat Oracle voor een geheel getal onder de 128 een smallint gebruikt. en voor een hoger getal een integer.

Iemand een idee?

>>>>>>>>>>>>>>>>>>>>>>>>>Vertel Microsoft over dit probleem <<<<<<<<<<<<<<<<<<<<<<<<<


  • TheMrH
  • Registratie: April 2000
  • Laatst online: 01-09 22:45
Ik zie dat je een varchar2(10) gebruikt? Dan weet je dus nooit precies hoe groot dat record is omdat Oracle deze opslaat met een variabele lengte. Die 10 tussen haakjes geeft alleen aan dattie maar 10 karakters max mag worden.

The box said 'requires Windows 95 or better', so I installed Linux...


  • Hu9o
  • Registratie: Mei 2001
  • Laatst online: 09:08

Hu9o

Schokkend

Topicstarter
Op maandag 04 maart 2002 09:03 schreef TheMrH het volgende:
Ik zie dat je een varchar2(10) gebruikt? Dan weet je dus nooit precies hoe groot dat record is omdat Oracle deze opslaat met een variabele lengte. Die 10 tussen haakjes geeft alleen aan dattie maar 10 karakters max mag worden.
Precies.

EN toch wil ik weten hoeveel byte m'n de inhoud van m'n database is.

>>>>>>>>>>>>>>>>>>>>>>>>>Vertel Microsoft over dit probleem <<<<<<<<<<<<<<<<<<<<<<<<<


  • GoeGie
  • Registratie: Juni 2001
  • Laatst online: 01-09 18:53
je zei dat je je database heb leeggemaakt.
Hoe heb je dat gedaan ?

  • Hu9o
  • Registratie: Mei 2001
  • Laatst online: 09:08

Hu9o

Schokkend

Topicstarter
Op maandag 04 maart 2002 09:48 schreef GoeGie het volgende:
je zei dat je je database heb leeggemaakt.
Hoe heb je dat gedaan ?
Niet helemaal leeg, maar gewoon in een aantal tabellen de records die niet meer bewaard hoeven te worden deleten.

>>>>>>>>>>>>>>>>>>>>>>>>>Vertel Microsoft over dit probleem <<<<<<<<<<<<<<<<<<<<<<<<<


Verwijderd

Op maandag 04 maart 2002 08:29 schreef Hu9o het volgende:
Volgends mij hebben jullie de vraag niet helemaal begrepen. Ik zal het nog eens uitleggen.


Iemand een idee?
Wel eens overwogen om de lege tabellen te trunceren, of alle data te exporteren, vervolgens de tabellen te trunceren en alle data weer in te laden? Daarmee defragmenteer en comprimeer je je DB. En DBA's doen het ECHT niet anders ;)
Daarnaast, dat verhaal over variabele lengte van VARCHAR2-datatype: daar is geen alternatief voor.
Hoogstens kan je CHAR( x) gebruiken, die heeft altijd een lengte x, ongeacht de lengte van de ge-inserte string. MAAR: dit datatype is alleen nog aanwezig voor compatibiliteit met oudere Oracle-versies. Niet meer gebruiken dus!

  • GoeGie
  • Registratie: Juni 2001
  • Laatst online: 01-09 18:53
Ben het helemaal eens met patrick.
- Data exporten (Oracle Export)
- Alle tabellen truncaten (daardoor worden de lege
extents beschikbaar)
- Data importeren.

en klaar is kees >:)

  • Hu9o
  • Registratie: Mei 2001
  • Laatst online: 09:08

Hu9o

Schokkend

Topicstarter
Op maandag 04 maart 2002 19:35 schreef GoeGie het volgende:
Ben het helemaal eens met patrick.
- Data exporten (Oracle Export)
- Alle tabellen truncaten (daardoor worden de lege
extents beschikbaar)
- Data importeren.

en klaar is kees >:)
Kost wel een verrot lange tijd. De database draait op m'n werk en wordt daar continu gebruikt. Het moet daar mogelijk zijn om op te vragen hoevol de db is, ZONDER eerst een tijd te wachten tot een export van minimaal 1 Gig klaar is.

Ik wil namelijk en Delphi een programmatje maken dat opvraag hoeveel mb data er in een database staat, en hoeveel er maximaal in kan staan. Deze twee van elkaar afhalen.... Maar dan moet ik wel weten hoeveel ruimte er extra gereserveerd wordt voor een string en een (small)integer.

>>>>>>>>>>>>>>>>>>>>>>>>>Vertel Microsoft over dit probleem <<<<<<<<<<<<<<<<<<<<<<<<<


Verwijderd

zie bv hier.

Dit soort berekeningen staat ook in de documentatie.

  • DigiK-oz
  • Registratie: December 2001
  • Laatst online: 13:38
Op maandag 04 maart 2002 08:29 schreef Hu9o het volgende:

Ik kan wel op vragen hoeveel records de tabellen bevatten. Als ik dan weer hoeveel bytes 1 record in beslag neemt. Kan ik dus ook bepalen hoeveel bytes er in de database zitten.

Maar HOE bepaal ik hoeveel ruimte er voor 1 record wordt opgeslagen.
Analyze table doen, en dan

SELECT AVG_ROW_LEN FROM ALL_TABLES WHERE TABLE_NAME = 'JOUWTABELNAAM';

Dat vermenigvuldigen met aantal records.

Overigens moet je ook nog rekening houden met overhead, afhankelijk van database blocksize, en o.a. de percentfree parameter van je tabel.

Whatever


Verwijderd

Op maandag 04 maart 2002 21:58 schreef Hu9o het volgende:

[..]

Kost wel een verrot lange tijd. De database draait op m'n werk en wordt daar continu gebruikt. Het moet daar mogelijk zijn om op te vragen hoevol de db is, ZONDER eerst een tijd te wachten tot een export van minimaal 1 Gig klaar is.
Tsja, wat wil je dan? Onderhoud kost nou eenmaal tijd. Dat betekent dus voor jou in het weekend een keer werken of, in geval van een online database de boel een keer offline brengen op een rustig tijdstip.

En wat vind je nou een 'verrot lange tijd'? Volgens mij kan je de hele klus in een uur klaren voor een middelgrote db.

Al met al krijg ik niet echt de indruk dat je een Oracle-crack bent, maar goed. Meer een soort hobbyist, en dat vind ik geen comfortabel idee aangezien je blijkbaar wel met grote produktiedatabases werkt.

  • GoeGie
  • Registratie: Juni 2001
  • Laatst online: 01-09 18:53
ja.. Cursusje Oracle DBA zou geen kwaad kunnen >:)

Als je in de buurt bent, kan ik je helpen.. waar woon je ?

  • GoeGie
  • Registratie: Juni 2001
  • Laatst online: 01-09 18:53
Hugo, ben je bekend met de DBA_ views binnen een Oracle Database ?

met behulp van die views kun je snel een query maken, die de free space bepaald per tablespace. Dat sommeren en dat weet je de vrije ruime binnen een tablespace.

LET OP: Dit betekent NIET dat dit een aaneengesloten vrije ruimte is. Ook de database kan gefragmenteerd zijn

Verwijderd

Het lijkt erop dat Hu9o er met of zonder onze hulp uit is, of dat hij van zijn stoel gevallen is. Njaa..
Pagina: 1