You are on page 1of 13

Mi minden van egy (Oracle) adatbzisban?

Adatbzisok szintjei 1. Fizikai szint (fjlok) Adatfjlok (ebben vannak trolva tnylegesen az adatok -> *.dbf) Naplfjlok (ebbe rdnak a mdostsokrl kszlt naplbejegyzsek -> *.log) Vezrlllomnyok (mindenfle informcik az adatbzisrl -> *.ctl) Paramterllomny (init.ora), jelszllomny... stb. 2. Logikai szint Az adatbzis objektumai (tbla, nzet, index ... stb.) Sma: egy adott felhasznl tulajdonban lv sszes objektum (de vannak olyan objektumok is, amelyek egyik smba se tartoznak bele) => Sma objektumok s Smn kvli objektumok ('kzsek', amikre mindenkinek szksge van) A tblk mindig valamilyen smban vannak! (azrt van kivtel) Pldul: egy adatbzis kapcsolat (database link) az sma objektum, de lehet public database link-et is ltrehozni, ami mr smn kvli objektum. Hasonl a helyzet a szinonimval. Van kt specilis sma: SYS s SYSTEM (ktelezen ltrejnnek, ebben vannak a rendszerkatalgus tblk) Egy objektumra trtn teljes hivatkozs: schema.objektum@database_link (-> elosztott adatbzis)

Tblk tulajdonsgainak vizsglata


describe T1; -- egy tbla oszlopainak s azok tpusnak kiratsa rdekessg: az adatbzis-kezel nem ismer describe-ot, mr a kliens 'lefordtja' egy SQL utastsra (valamilyen select-re) De akkor honnan veszi a rendszer a tbla oszlopaira vonatkoz infokat? -> Rendszerkatalgus Rendszerkatalgus: tblkbl (nzetekbl) ll, melyek az adatbzis teleptsekor ltrejnnek s klnbz adminisztrcis infkat trolnak. Nevezik adatsztrnak, rendszer-katalgusnak vagy meta-adatbzisnak is. Valjban nem is igazi tblk, hanem nzetek. ltalban beszdes nevk van: prefix_nev Pldk prefixre: USER (az adott user tulajdonban lv objektumok) pl. USER_TABLES ALL (amihez joga van az adott usernek) pl. ALL_TABLES DBA (az adatbzis sszes objektuma) pl. DBA_TABLES Pldul az egyes tblk oszlopairl a DBA_TAB_COLUMNS tblbl lehet infhoz jutni. Azrt egy igazi rendszerben egy 'mezei' felhasznlnak nincs joga mindenhol nzeldni. Nektek most van. Az sszes katalgus tbla neve s oszlopai -> Oracle doksi: Reference Static Data Dictionary Views A legfontosabb adatsztr, ahonnan rdemes kiindulni a keresskor: DBA_OBJECTS (ALL_OBJECTS) Part II

Tblk ltrehozsa
CREATE TABLE tablanev(o1 tipus ... ) Tpusok: - char(n) (fix hossz, statikusan lefoglal n karakternyi helyet) - varchar2(n) (vltoz hossz, maximum n karaktert lehet trolni, de mindig csak annyit hasznl, amennyi pp szksges) Ktfajta karakter-sszehasonltsi szemantika van!! - blank-padded: a rvidebb stringet kiegszti szkzkkel, hogy ugyanolyan hossz legyen a kt string s utna hasonlt ssze - non-padded: nem egszt ki semmit. gy nyilvn a rvidebb string a kisebb. Mikor fontos? pldul 'AB ' s 'AB' sszehasonltsa esetn blank-padded: 'AB ' = 'AB' non-padded: 'AB ' > 'AB' Fontos, hogy a blank-padded-et kt CHAR tpus rtknl hasznlja, minden ms esetben a non-padded rvnyes! Numerikus tipusok: - Number: (a leggyakoribb, s legsokoldalbb) Meg lehet neki adni paramtereket Number(p,s) -> fixpontos trols p - precision (pontossg - jegyek szma) s - scale (tizedes jegyek szma, lehet < 0) Number(20,-2) -> szzasokra kerekt Number(p) -> ilyenkor nincsenek tizedes jegyek - egsz szm - Integer, Float stb: a legtbb esetben Numbert csinl belle az Oracle Plda: CREATE TABLE num_proba(o_integer integer, o_float float, o_number number, o_num10 number(10), o_num10_2 number(10,2)); SELECT column_id, column_name, data_type, data_length, data_precision, data_scale FROM dba_tab_columns WHERE table_name='NUM_PROBA'; Megjegyzs: az oracle a katalgus tblkban a neveket csupa nagybetvel trolja. Dtum tpus: - Date: msodperc pontossgot tud Dtum esetn fontos, hogy a lekrdezskor milyen formtumban kapom meg a dtumot. Ez kliens fgg! (Mrmint az alaprtelmezs, persze ezt a lekrdezsben meg tudom vltoztatni) Konverzik: TO_DATE (karakter -> dtum) TO_CHAR (dtum -> karakter) Aktulis rendszerdtum select sysdate from dual; select TO_CHAR(sysdate, 'yyyy-mm-dd:hh24:mi:ss') from dual; -> lsd a formtummodelleket create table t_datum(o date); Gond lehet a beszrsnl, mert el kne tallnom az alaprtelmezett formtum stringet, amivel vrja a dtumot! Megolds -> to_date

insert into t_datum values(to_date('2007-02-19', 'yyyy-mm-dd')); Vagyis a to_date()-nl gy adom meg a dtumot, ahogy akarom, csak a msodik paramterben meg kell mondanom neki a formtum stringet, amit hasznltam. Egyb tpusok: LOB - Large OBject (tbb, mint 4 gigabjtos adatot is bele lehet pakolni) BLOB - Binary LOB CLOB - Characher LOB ROWID - spec. tpus, tulajdonkppen egy pointer, ami egy sornak a fizikai helyre mutat Dafault rtkek: Van egy tblm, aminek mondjuk van 3 oszlopa. Mi trtnik ha egy INSERT-nl csak az els kt oszlopnak adok rtket? 1. NULL kerl a 3. oszlopba (de sokszor ezt megtiltjuk -> NOT NULL) 2. Be lehet lltani ilyen esetre Default rtket az oszlopoknak Plda: CREATE TABLE t(fizetes number(6) DEFAULT 1000, hire_date date DEFAULT SYSDATE);

Szinonima
Egy tblnak (vagy nzetnek) adhatok egy msodlagos nevet. CREATE SYNONYM dolg_syn FOR dolgozo; Akr tvoli adatbzisban lev tblkra is ltre lehet hozni. Lehet publikus/nem publikus (ez utbbi a sajt smmba tartozik)

Szekvencia
Egy sorszmgenertor. Olyan, mint az auto_increment MySQL-ben. Megadhat tulajdonsgok: - Lpskz - Kezdeti rtk - Maximlis rtk - Krbefuthat-e (ha elrte a max-ot, jrakezdje-e) Ltrehozs: CREATE SEQUENCE Hogyan lehet hasznlni? Szekv_nev.NEXTVAL: kvetkez rtk lekrse (be lehet rni pl. egy INSERT utastsba is) Szekv_nev.CURRVAL: akkor j, ha beszrs utn kell mg a kiosztott sorszm Pldul beszrok egy Osztlyt, az okod-ot szekvencival krem le. Utna be akarom szrni az osztly dolgozit, ehhez kell az elbb beszrt osztly kdja.

Adatbzis kapcsol (database link)


Egy msik Oracle adatbzishoz val kapcsoldst tesz lehetv. gy egyszerre kt adatbzisban lev objektumokat is el tudunk rni egyetlen lekrdezsbl. Az egyik adatbzishoz kapcsoldunk a kliens programunkkal (pl. SqlDeveloper), s ez az adatbzis fog a msikhoz kapcsoldni az adatbzis kapcsolban megadott informcik segtsgvel. Ezek az informcik teht tartalmazzk az elrni

kvnt adatbzis elrhetsgt, a tvoli adatbzisbeli felhasznlnevet s jelszt. Pldul a tomx -> oradb kapcsolat ltrehozsa: CREATE DATABASE LINK oradb CONNECT TO user1 IDENTIFIED BY jelsz1 USING 'oradb'; Az utols paramter ('oradb') a tomx adatbzis gpn tallhat tnsnames.ora llomnyban szerepl ler rszre (connect stringre) utal. A ler rszben szerepl informcikat megadhatjuk kzvetlenl az idzjelek kztt is: CREATE DATABASE LINK oradb CONNECT TO user1 IDENTIFIED BY jelsz1 USING 'medusa.inf.elte.hu:1521/oradb.dbpc75.inf.elte.hu'; A fentiek utn egy lekrdezs, a tomx adatbzisban kiadva: SELECT * FROM t1, tab@oradb t2 WHERE t1.o1 = t2.o2;

Fizikai trols
Azt szeretnnk megvizsglni, hogy ha van mondjuk egy T1 tblnk, az hol s melyik fjlban van, valamint az abban tallhat adatok tnylegesen hogyan vannak trolva. Adatblokk: a legkisebb trolsi egysg (2K, 4K, 8K, ...) (Minden fjlt az adatbzis-kezel feloszt blokkokra.) A jelenlegi adatbzisunkban 8k a blokkmret. Extens (extent, kiterjeszts): adatblokkokbl ll sszefgg terlet. Pldul ha egy fjl mrett nvelni kell, akkor valahny extens-sel nveli a rendszer Adatfjl: extensekbl ll Szegmens (segment): mindig tbb extensbl ll, s egy szegmens pontosan egy objektumhoz (pl. tbla, index, klaszter) tartozik. tnylhat tbb adatfjlra is, de persze egy fjlban lehet tbb szegmens is. Egy szegmens ~ Egy objektum Tblatr (tablespace): Tblatr - adatfjl kapcsolat 1-N Tblatr - szegmens kapcsolat 1-N Vannak ktelez tblaterek is: SYSTEM, SYSAUX stb. A trolssal kapcsolatos fogalmak s azok egymssal val kapcsolata +-----------+ | ADATBZIS | +-----------+ | /|\ +----------+ +--------| TBLATR |--------+ | +----------+ | /|\ /|\ +----------+ +----------+ | ADATFJL | | SZEGMENS | +----------+ +----------+ | |

/|\ | +--------+ | | EXTENS |+----------------------+ +--------+ | /|\ +-------+ | BLOKK | +-------+ Kapcsold katalgusok ---------------------DBA_DATA_FILES: a rendszer ltal hasznlt adatfjlok informcii DBA_TEMP_FILES: a temporlis tblaterek adatfjljainak informcii DBA_TABLESPACES: tblaterek informcii Szegmensekrl bvebben ---------------------DBA_SEGMENTS, DBA_EXTENTS Adatbzis objektumok: - fizikai trolssal rendelkez objektumok pl. tbla, index, cluster - fiz. trolssal nem rendelkez objektumok pl. procedura, nzet, szekvencia (csak a definci van trolva) Szegmens sok mindenhez tarozhat, a DBA_SEGMENTS.SEGMENT_TYPE mutatja, hogy egy adott szegmens mihez tartozik SELECT * FROM dba_segments WHERE owner='NIKOVITS' AND segment_name='DOLGOZO' AND SEGMENT_TYPE='TABLE' Rgebben 1 tbla 1 szegmens volt, azonban mita nagyon nagy tblkat is kpes kezelni a rendszer, mr nem clszer 1 szegmensbe tenni egy nagy tblt. Partcionls: egy tblt tbb szegmensre osztunk fel. Meg lehet adni, hogy milyen szempontok alapjn darabolja fel a tblt. Pldul intervallumokat adhatunk meg -> Range partcionls. Vagy van mg Lista s Hash partcionls, st lehet olyat is, hogy csinlok egy particionlst s az egyes partcikat tovbb lehet particionlni. Csak kt szint mlysgig lehet. Ksbb mg lesz rla sz. rdekessg, hogy ilyenkor egy tbla mr tlnylhat egy tblatren. Csak azt lehet garantlni, hogy minden szegmense (partcija) pontosan egy tblatren van. rdekessg az rdekessgben: nem csak azrt llhat egy tbla tbb szegmensbl, mert nagyon sok adat van benne, hanem az is lehetsges, hogy valamilyen LOB tpus adat van benne. Ilyenkor rdemes lehet a LOB tpus adatokat kirakni kln szegmensre.

Trolsi paramterek
Amikor ltrehozunk egy tblt, a CREATE TABLE-ben megadhatunk n. trolsi paramtereket. Megj.: nem csak a CREATE TABLE-nl lehet, hanem a CREATE INDEX, CREATE CLUSTER stb. esetn is, vagyis minden trolst ignyl objektumnl.

CREATE TABLE tipus_proba(...) TABLESPACE users PCTUSED 50 PCTFREE 20 INITRANS 1 MAXTRANS 255 STORAGE (INITIAL 32K MINEXTENTS 1 MAXEXTENTS 200 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT); STORAGE(...): hogyan viselkedjenek az extensek, mekkork legyenek, hogyan bvljenek stb. - INITIAL: els extens mrete - NEXT: kvetkez extens mrete - PCTINCREASE: milyen mrtkben nvekedjenek az extensek (%-ban) az elzhz kpest. (50 azt jelenti, hogy msflszerese lesz a kvetkez) - MINEXTENTS: minimlis extens darabszm (a tbla ltrehozsakor ennyit automatikusan ltrehoz) - MAXEXTENTS: maximlis extens darabszm stb. Az Oracle nem mindig hallgat rnk, mert vannak olyan peremfelttelek, amiket mindenkppen be kell tartania. Ilyen pldul a blokkmret. Hiba adunk meg brmekkora rtket is extens mretnek, annak mindenkppen a blokkmret tbbszrsnek kell lennie. Az is elfordulhat, hogy az adott tblatren valamilyen szablyok alapjn osztja ki az oracle az extenseket, mert eleve gy hoztuk ltre a tblateret (lsd CREATE TABLESPACE utasts paramterei). Pldul van egy legkisebb extens (MINIMUM EXTENT) mret, aminl kisebbet nem hajland kiadni, vagy egy adott mret tbbszrst adja ki mindig (UNIFORM). Ilyen esetekben az Oracle a peremfeltteleinek figyelembe vtelvel hallgat csak a megadott utastsra. PCTUSED, PCTFREE: A blokkokkal hogyan gazdlkodjon a rendszer. ltalban szoks gy csinlni, hogy a blokkokat nem rakjuk tele azrt, hogy egy ksbbi mdosts utn is mg befrjenek a sorok a blokkba. - PCTFREE: hny %-ot hagyjon szabadon - PCTUSED: ha ez al cskken a blokk foglaltsga, akkor szabadnak nyilvntja a blokkot, s ismt enged belerni. Plda: CREATE TABLE t1 (o1 NUMBER, o2 CHAR(20)) NOLOGGING TABLESPACE users PCTFREE 0 PCTUSED 50 STORAGE (INITIAL 100K NEXT 200K MINEXTENTS 3 MAXEXTENTS 5); Mi van akkor, ha nem adok meg ilyen (trolsi) paramtereket? Minden felhasznlnak van egy default tblatere (lsd DBA_USERS-ben) Minden tblatrnek vannak a trolsra vonatkoz default rtkei (lsd DBA_TABLESPACES) s mg vannak adatbzis-szint alaprtelmezsek is. A tbla nvekedsekor az Oracle automatikusan jabb extenseket ad hozz, ha szksg van r. Mindezt manulisan is kezdemnyezhetjk, s a nem hasznlt extenseket fel is szabadthatjuk. ALTER TABLE emp ALLOCATE EXTENT (SIZE 200K DATAFILE '/big/oracle/oradata/oradb/users01.dbf'); ALTER TABLE emp DEALLOCATE UNUSED;

Tblaterek
A tbla sok paramtert a tblatr belltsaitl rkli ha kln nem adjuk meg. A tblaterek ltrehozsakor megadhat paramterek kzl nhny fontosabb: ONLINE | OFFLINE BLOCKSIZE (tblaterenknt szablyozhat a blokkmret) UNDO (nem tehet r normlis objektum, a tranzakci-kezelshez hasznlatos) TEMPORARY (csak tmeneti szegmensek kerlhetnek r, pl. rendezskor) DATAFILE AUTOEXTEND ON | OFF Adatfjlonknt megadhat, hogy azok automatikusan nvekedhetnek-e s meddig. MINIMUM EXTENT (A fragmentci elkerlse cljbl megadhat, hogy mekkora lehet a legkisebb extens a tblatren.) DEFAULT STORAGE (INITIAL, NEXT ... stb.) A tbla innen rkli, ha kln nem adtuk meg. EXTENT MANAGEMENT {DICTIONARY | LOCAL [AUTOALLOCATE | UNIFORM]} Az extensek kezelst lehet itt megadni. A loklisan menedzselt tblatr extenseinek mrett az Oracle vagy automatikus mdon hatrozza meg, vagy egyforma mret extenseket hasznl. SEGMENT SPACE MANAGEMENT {MANUAL | AUTO} Manulis esetben a szegmensen belli szabad helyeket szabad listk segtsgvel kezeli az oracle (lsd FREELISTS), automatikus esetben pedig egy bitmap trkp segtsgvel.

Pldk:

CREATE UNDO TABLESPACE undots1 DATAFILE 'undotbs_1a.f' SIZE 100M AUTOEXTEND ON NEXT 20M MAXSIZE 400M; CREATE TABLESPACE tbs_1 DATAFILE 'tabspace_file2.dat' SIZE 200M DEFAULT STORAGE (INITIAL 100K NEXT 200K MINEXTENTS 1 MAXEXTENTS 999) ONLINE; CREATE TABLESPACE tbs_4 DATAFILE 'file_1.f' SIZE 100M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K; CREATE TABLESPACE auto_seg_ts DATAFILE 'file_2.f' SIZE 100M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO; CREATE TEMPORARY TABLESPACE temp TEMPFILE 'temp01.dbf' SIZE 5M AUTOEXTEND ON; (Ez utbbit nem a DBA_DATA_FILES katalgusban, hanem a DBA_TEMP_FILES katalgusban talljuk)

Indexek
Az indexek szempontjbl fontos a ROWID tpus ismerete Specilis mutat tpus, amivel egy sort lehet azonostani. Minden sorrl meg tudom mondani, hogy egy adott sor:

- melyik adatfjlban van - azon bell melyik blokkban - azon bell hnyadik rekord Ez nincs a tblban trolva, de mgis gy viselkedik: pszeudo oszlop Plda: SELECT rowid, empno, ename, sal FROM nikovits.emp; 18 karakteren rdik ki, a kvetkez formban: OOOOOOFFFBBBBBBRRR OOOOOO - az objektum azonostja FFF - fjl azonostja (tblatren belli relatv sorszm) BBBBBB - blokk azonost (a fjlon belli sorszm) RRR - sor azonost (a blokkon belli sorszm) A ROWID megjelentskor 64-es alap kdolsban jelenik meg. Az egyes szmoknak (0-63) a kvetkez karakterek felelnek meg: A-Z -> (0-25), a-z -> (26-51), 0-9 -> (52-61), '+' -> (62), '/' -> (63)

Indexek ltrehozsa
CREATE INDEX (vagy ALTER INDEX) utastsban adhatk meg az index paramterei. A hagyomnyos index B-fa szerkezet, a fa leveleiben vannak a bejegyzsek, s mellettk a sorazonost (ROWID). Az index lehet 1 vagy tbboszlopos. Ha egy rtk tbbszr szerepel a tblban, akkor az indexben is tbbszr fog szerepelni, minden sorazonostval kln-kln. A levlblokkok mindkt irnyban lncolva vannak, gy nvekv s cskken keressre is hasznlhat az index. (pl. WHERE o > x vagy WHERE o < y) A csupa NULL rtk nem szerepel az indexben bejegyzsknt. rdemes a NULL rtkek helyett DEFAULT-ot hasznlni, pp az elzek miatt. Az indexek esetn is megadhatk trolsi paramterek, hasonlan a tblkhoz. Az index ltrehozsakor megadhat legfontosabb paramterek: UNIQUE -> egyedi index ltrehozsa -> nvekv vagy cskken sorrend szerint pljn-e fel az index

ASC | DESC

CREATE UNIQUE INDEX emp1 ON EMP (ename); CREATE INDEX emp2 ON emp (empno, sal DESC); REVERSE (Fordtott kulcs index ltrehozsa) A kulcsoszlop bjtjai az indexben fordtott sorrendben vannak. Ha tbb oszlopos az index, az oszlopok sorrendje nem vltozik. Ez fleg akkor hasznos, ha szekvencia alapjn tltnk fel egy tblt (amikor a kulcsok sorban egyms utn kerlnek kiosztsra), mert a fordtott kulcs index egyenletesen elosztja a bejegyzseket az indexben. Viszont az ilyen index nem hasznlhat intervallum jelleg keressekhez, mert a szomszdos rtkek nem egyms mellett helyezkednek el. CREATE INDEX emp3 ON emp (empno, sal) REVERSE; Index jraptse (idnknt hasznos, mivel a trlt sorok bejegyzsei fizikailag nem trldtek ki) ALTER INDEX i1 REBUILD TABLESPACE ts1 [REVERSE | NOREVERSE]; A fenti utastssal j tblatrre tehet az index, a logikailag trlt bejegyzsek helye felszabadul, s fordtott kulcsv ill. normliss is tehet az index.

NOSORT Azt jelezzk vele, hogy nem kell rendezni az index ltrehozsakor, mert a sorok mr rendezve vannak. Ha mgsem gy van, az oracle hibt jelez. Pl. CREATE TABLE ind_t(o1 int, o2 varchar2(20), o3 char(10)); BEGIN FOR i IN 1..100 LOOP INSERT INTO ind_t VALUES(i, 'sor'||to_char(i)||'-BLABLA', ABC); END LOOP; COMMIT; END; CREATE INDEX ind_t_ix ON ind_t(o1) NOSORT; Ha mg egy (o1=1) sort beszrnnk a tblba, akkor mr hibazenetet kapnnk a fenti NOSORT-ra. COMPRESS <n> A kulcs rtkek ismtelt trolst szntetjk meg vele az index els n oszlopban. Vagyis ezek a kulcsrtkek csak egyszer lesznek trolva, s mellettk tbb sorazonost lesz, azoknak a soroknak megfelelen, amelyek az adott rtkkel rendelkeznek. CREATE INDEX emp4 ON emp (empno, ename, sal) COMPRESS 2; Fggvny alap index Akkor hasznos, ha a lekrdezsben is e kifejezs szerint keresnk. (plusz infk a katalgusban -> DBA_IND_EXPRESSIONS) CREATE INDEX ind_t_ix3 ON ind_t (SUBSTR(o2, 1, 5), UPPER(o3)); BITMAP Bitmap index ltrehozsa Hasonl a B-fa indexhez, de a levelekben a kulcsrtk mellett nem a ROWID-k troldnak, hanem egy bittrkp. (Az els s utols rintett ROWID valamint a kztk lv sorokra vonatkoz bittrkp.) Minden sornak egy bit felel meg, ami azokra a sorokra lesz 1-es, amelyek az adott rtket tartalmazzk. Mdostskor az egsz bittrkpet zrolni kell, gy a bittrkp ltal rintett sorok sem mdosthatk a tranzakci vgig. CREATE BITMAP INDEX ind_t_ix4 ON ind_t (o2); Index szervezett tbla (Index Organized Table -> IOT) Egytt (egy szegmensen) troldik a tbla s az index, ilyen esetben ktelez elsdleges kulcs megadsa. Ltrejn egy logikai tbla (szegmens nlkl), egy index szegmens, s egy tlcsordulsi szegmens (ahov a sorok vge kerl). PCTTRESHOLD: Egy index bejegyzs a blokknak hny szzalkt foglalhatja el. Ha ennl nagyobb a sor -> tlcsorduls INCLUDING: Mely oszlopok troldjanak egytt a kulccsal. A megadott oszlop utniak -> tlcsordulsi szegmensre OVERFLOW: Ha nem adjuk meg, akkor nem is hozza ltre a tlcsordulsi szegmenst, csak ha szksg lesz r. CREATE TABLE cikk_iot ( ckod integer, cnev varchar2(20), szin varchar2(15), suly float,

CONSTRAINT cikk_iot_pk PRIMARY KEY (ckod) ORGANIZATION INDEX PCTTHRESHOLD 20 INCLUDING cnev OVERFLOW TABLESPACE users;

A fenti utasts hatsra kt szegmens jn ltre (egy index s egy tbla), valamint egy olyan objektum, amihez nem tartozik szegmens, s gy nincs is DATA_OBJECT_ID-ja !!! Informcik az indexekrl a katalgusban: DBA_INDEXES DBA_IND_COLUMNS (indexbeli oszlopok) DBA_IND_EXPRESSIONS (fggvny alap index kifejezsei) Index szervezett tbla index rsze: DBA_INDEXES -> index_type s table_name oszlopok Index szervezett tbla tbla rsze: DBA_TABLES -> iot_name s iot_type oszlopok A ROWID egy tovbbi hasznlata A ROWID ltalban minden olyan esetben hasznlhat, amikor egy konkrt sorra mutat pointerre van szksgnk. Pldul egy constraint utlagos ltrehozsakor megadhat, hogy a mr ltez, a constraintet megsrt sorok sorazonosti mely tblba rdjanak be, hogy ezekkel a sorokkal valamit tenni tudjunk. Alaprtelmezs szerint (ha nem adjuk meg a kulcsszt) az EXCEPTIONS nev tblba rdnak be, aminek a ltrehozst a kvetkez utastssal vgezhetjk el: CREATE TABLE exceptions(row_id rowid, owner varchar2(30), table_name varchar2(30), constraint varchar2(30)); lsd az oracle ltal elre megadott utlexcpt.sql scriptet Hozzunk ltre egy plda tblt: CREATE TABLE const_t (o1 number, o2 char(10), o3 date ); Szrjunk be nhny sort, amelyek kzl nhny megsrti az albb megadand constraintet. INSERT INTO const_t VALUES(1, 'Egy', '2004-jan-02'); INSERT INTO const_t VALUES(2, 'Ket', '2003-jan-02'); INSERT INTO const_t VALUES(3, 'Har', '2005-jan-02'); Az albbi utastst nem fogja vgrehajtani a rendszer, s hibazenetet kapunk, viszont feltlti az exceptions tblt a megfelel sorokkal. ALTER TABLE const_t ADD CONSTRAINT const_c CHECK(o3 > TO_DATE('2005-jan-01', 'YYYY-mon-dd')) EXCEPTIONS INTO exceptions; Errl az albbi lekrdezssel gyzdhetnk meg: SELECT * FROM const_t WHERE ROWID IN (SELECT ROW_ID FROM exceptions); O1 O2 O3 ---- ---------- ----------4 Egy 2003-jan-02 1 Egy 2004-jan-02

Particionls
Egy tbla fel van osztva tbb partcira. Minden partci egy-egy szegmens, kivve ha alpartcionls is van, mert ilyenkor egy alpartci alkot egy szegmens-t. Ha gyesen partcionltuk a tblt, akkor a lekrdezsnek lehet, hogy nem kell a teljes tblt vgignznie, hanem csak egy (vagy nhny) partcit. A feloszts trtnhet intervallumok

10

alapjn, hash mdszerrel, vagy lista alapjn. Az egyes partcik tovbb oszthatk -> SUBPARTITION (alpartci) Pldk partcionlt tbla ltrehozsra -> cr_part_table.txt

Particionlt index
Loklis: Megprblja szinkronban ltrehozni a tbla partcikat s az index partcikat. 1 tbla partci <-> 1 index partci Globlis: Amikor nincs meg ez az sszerendels. Prefixelt: Az indexet alkot oszloplista egy-egy prefixe tartozik egy-egy partciba. Pldul ha ckod, cnev alapjn indexelek, mondhatom azt, hogy az els partciba tartozzanak azok a bejegyzsek, ahol a ckod kisebb, mint 200, a msodikba azok, ahol a ckod kisebb mint 500 (de nagyobb, mint 200) Nem prefixelt: amikor nincs meg a fenti sszefggs az index oszlopok s a partcionl oszlopok kztt. Ha a partcionlt index loklis, annak is van elnye, ha prefixelt annak is van elnye. Ha egyik elnye sincs meg, akkor nincs rtelme az indexet partcionlni. -> Nem lehet ltrehozni globlis, nem prefixelt indexet!!! Pldk partcionlt index ltrehozsra -> cr_part_index.txt Informcik a partcionlt tblkrl s indexekrl a katalgusban: DBA_PART_TABLES, DBA_PART_INDEXES, DBA_TAB_PARTITIONS, DBA_IND_PARTITIONS, DBA_TAB_SUBPARTITIONS, DBA_IND_SUBPARTITIONS, DBA_PART_KEY_COLUMNS

Clusterek
Kicsit ellenttes filozfit kpvisel, mint a normalizls. Pl. Vannak Osztlyok s Dolgozk Normalizlva: Osztly(okod, nev, telephely, ...) Dolgozo(dkod, okod, nev, ...) Nagy tblk esetn ezzel az a baj, hogy nagyon szt vannak szrva az adatok. Ha pldul a 10-es kd osztly dolgozirl akarok informcikat, akkor rengeteget kell olvasgatni a lemezrl. Ami j lenne: legyenek egytt trolva az egyes osztly dolgozi Erre j a cluster: tbb tblt fizikailag egy egysgknt (egy szegmensben) trol. Mi kell ahhoz, hogy hasznlhassunk cluster-eket? Legyen egy vagy tbb kzs oszlopa a tblknak. Kzs oszlop: az oszlopok tpusa kell, hogy megegyezzen (a nv mindegy) A clusterek esetn megint nem igaz, hogy egy tbla egy szegmens, hanem: Egy cluster = egy szegmens Cluster ltrehozsa: CREATE CLUSTER Meg kell adni a kulcst, kulcsait is. Utna majd ehhez kell kapcsolni a tblk "kzs" oszlopait. CREATE CLUSTER personnel ( department_number NUMBER(2) ) SIZE 512

11

STORAGE (INITIAL 100K NEXT 50K); A cluster is egy szegmens, s gy megadhatk a trolsval kapcsolatos paramterek. TABLESPACE, STORAGE () stb. Tblk feltevse a clusterre: CREATE TABLE emp ( empno NUMBER PRIMARY KEY, ... , deptno NUMBER(2) NOT NULL) CLUSTER personnel (deptno) CREATE TABLE dept ( deptno NUMBER(2), dname VARCHAR2(9), loc VARCHAR2(9)) CLUSTER personnel (deptno) rdekessgek: A cluster kulcs csak egyszer troldik Akkor j igazn, ha egyenlsges felttelt hasznlok lekrdezsnl, s nem az sszes osztly informci kell, hanem csak nhny. Pldul csak a 10-es s 20-as osztlyokrl akarok inft. Nylvn ez csak akkor lehet hatkony, ha gyorsan el tudok rni egy rszt a clusterbl |10 osztly sor | | dolgoz sor | dolgoz sor | dolgoz sor |20 osztly sor | | dolgoz sor | dolgoz sor |30 osztly sor | | dolgoz sor stb. | | | | | |

Hogyan lehet gyorsan keresni a clusterben? Kell valamilyen segdstruktra. Sz szerint KELL, amg nem csinlok egy ilyet, nem is enged beszrni a clusterbe sorokat. Ez a segdstruktra lehet index, vagy hash tblzat. Index cluster gy mkdik, ahogy ezt mr lttuk Csak a cluster kulcsra lehet ltrehozni az indexet, azaz nem is kell megadni az indexnl az oszlopot, amire az indexet ltrehozom. CREATE INDEX idx_personnel ON CLUSTER personnel; Csak az index ltrehozsa utn enged sorokat beszrni a tblkba!!! Hash cluster Egy hash fggvny ltal visszaadott rtk alapjn helyezi el a kulcsrtkeket. Elre meg kell adnom, hogy hny hash rtk lesz. CREATE CLUSTER personnel1 ( department_number NUMBER ) SIZE 512 HASHKEYS 500 STORAGE (INITIAL 100K NEXT 50K); Vagyis a cluster ltrehozsnl kell megadni, hogy hash clustert csinljon. Ha nem adjuk meg a HASHKEYS-t, akkor index clustert kszt. rdekessg: hiba adtam meg 500-at, valjban a kvetkez prmszmot (503) fogja belltani. (A hash fv mkdse miatt)

12

De megadhatok sajt hash fv-t is: CREATE CLUSTER personnel2 ( home_area_code NUMBER, home_prefix NUMBER ) HASHKEYS 20 HASH IS MOD(home_area_code + home_prefix, 101); Ez azrt j, mert gy elvileg szablyozhatom, hogy hova kerljenek az egyes sorok. Az azonos hash rtk sorok fizikailag ugyanoda kerlnek. Pldul van kt tblm s azt akarom, hogy ezeknek bizonyos sorai egy blokkba kerljenek. Megolds: sajt hash fv-t csinlok, mondjuk egy ilyet: HASH IS MOD(kulcs, 11) s az egyes soroknak olyan cluster kulcs rtket adok, amik mod 11 megegyeznek. Az elhelyezkedst utlag ellenrizhetem ha megnzem a sorok ROWID-jt. Trolsi paramterek: SIZE Megadhat, hogy az azonos klaszter kulcs rtkkel rendelkez sorok szmra mekkora helyet foglaljon le az oracle. Megadsa valjban csak akkor fontos, ha azt szeretnnk, hogy egy blokkban tbb klnbz klaszter kulccsal rendelkez sor is troldjon. Ha nem adjuk meg, vagy a mrete nagyobb a blokkmretnl, akkor az oracle minden klaszter kulcsot klnbz blokkba tesz. SINGLE TABLE Egyetlen tblt tartalmaz hash klaszter ltrehozsa. Ez arra j, hogy egy olyan tblt tudjunk ltrehozni, amelynek a fizikai trolsa hash alap elrst tesz lehetv. CREATE CLUSTER personnel3 (deptno NUMBER) SIZE 512 SINGLE TABLE HASHKEYS 500; Clusterekkel kapcsolatos katalgusok: DBA_CLUSTERS DBA_TABLES (cluster_name oszlop -> melyik klaszteren van a tbla) DBA_CLU_COLUMNS (tblk oszlopainak megfeleltetse a klaszter kulcsnak) DBA_CLUSTER_HASH_EXPRESSIONS (hash klaszterek hash fggvnyei)

13