Delo z indeksi

Delo z indeksi

Uporaba sekundarnih indeksov ima pozitivne in negativne posledice.

Pozitivne posledice

- Hitrejše iskanje podatkov (če je tabela indeksirana po atributu, ki je ključ za iskanje)
- Hitrejši prikaz razvrščenih podatkov

Negativne posledice

- Večja poraba pomnilniškea prostora (diska, RAM-a)
- Počasnejša izvedba stavkov za dodajanje, brisanje in spreminjanje vsebine tabele

Nasveti

- S številom sekundarnih indeksov ne pretiravajte.
- Tudi za sekundarne indekse naj velja pravilo, da so čim krajši.
- Le izjemoma uporabljajte sestavljene sekundarne indekse.
- Ne brišite primarnih indeksov (razen, če je to res nujno potrebno). Nekateri SUPB-ji ne omogočajo brisanja primarnih indeksov, nekateri pa omogočajo ih hkrati izbrišejo tudi vse sekundarne indekse.
- Pred morebitnim brisanjem ali spreminjanjem primarnih ključev obvezno naredite arhivsko kopijo PB.

Stavek za kreiranje sekundarnega indeksa - CREATE INDEX

Sintaksa stavka za kreiranje sekundarnega indeksa:

> CREATE [int_omejitve] INDEX ime_indeksa ON ime_tabele (atribut1, atribut2, ..);

Int_omejitve: [UNIQUE] [ASC] | DESC]

Stavek naredi sekundarni indeks z imenom ime_indeksa, ki ga sestavljajo atributi atrubut1, atribut2, ... Indeks je lahko razločevalen (če je podana integritetna omejitev UNIQUE.

Indeks je lahko urejen naraščajoče (ASC) ali padajoče (DESC). Privzeta nastavitev je ASC.

Opomba: integritetne omejitve podpirajo le nekateri SUPB.

Primer stavka, ki za tabelo Praznik naredi sekundarni indeks po_datumih:

CREATE INDEX po_datumih ON Praznik (mesec,dan);

Prikaz vseh indeksov PB s tabelami Praznik in Proslava
Stavek za brisanje indeksa - DROP INDEX

Sintaksa stavka za brisanje sekundarnega indeksa:

> DROP INDEX ime_indeksa; ali

> DROP INDEX ime_indeksa ON ime_tabele;

Primer stavka, ki za tabelo Proslava najprej naredi sekundarni indeks ‘poCeni', indeks je urejen padajoče - od najdražjih proslav do najcenejših. Naslednji stavek pa izbriše sekundarni indeks 'poCeni'.

> Create DESCENDING Index poCeni ON Proslava (Cena);

> Drop Index poCeni;

// Opomba: večina SUPB zahteva razločevalna imena sekundarnih indeksov! Primer je narejen za SUPB Firebird.

Brisanje primarnega ključa tabele?

SUPB sicer omogočajo tudi brisanje primarnega ključa tabele. Kljub temu je ta operacija nezaželena in največkrat povzroča precej težav.

Sledita dva zgleda kreiranja tabele s primarnim ključem in takoj za tem brisanja primarnega ključa. V prvem primeru težav ni, ker primarni ključ še ni bil uporabljen pri povezavanju z drugimi tabelami PB. Tovrstna situacija je v praksi prava redkost. V drrugem primeru je ponazorjena napaka pri brisanju primarnega ključa, ki je v praksi pogosta.

Prvi primer - brez težav

> /* naredimo tabelo test, primarni ključ je id */

> SQL> create table test (id integer not null, neki char(10), primary key (id));

> /* prikaz strukture tabele test1 */

> SQL> show table test;
> ID INTEGER Not Null
> NEKI CHAR(10) Nullable
> CONSTRAINT INTEG_37:
> Primary key (ID)

> /* poiskus brisanja primarnega ključa tabele test uspe */
> SQL> alter table test drop constraint integ_37;
> SQL> show table test;
> ID INTEGER Not Null
> NEKI CHAR(10) Nullable
> SQL>

Drugi primer - težave pri brisanju primarnega ključa

/* naredimo tabelo test1, primarni ključ je id */

SQL> create table test1 (id integer not null, neki char(10), primary key (id));

/* prikaz strukture tabele test1 */

SQL> show table test1;
ID INTEGER Not Null
NEKI CHAR(10) Nullable
CONSTRAINT INTEG_39:
Primary key (ID)

/* naredimo tabelo test2, atribut id2 je tuji ključ tabele test2 in se sklicuje na primarni ključ tabele test1 */

SQL> create table test2 (id integer not null, id2 integer not null references test1 (id) on delete no action on update no action, primary key (id));

/* prikaz strukture tabele test2 */
SQL> show table test2;
ID INTEGER Not Null
ID2 INTEGER Not Null
CONSTRAINT INTEG_42:
Foreign key (ID2) References TEST1 (ID) On Update No Action On Delete No Ac
tion
CONSTRAINT INTEG_43:
Primary key (ID)

/* poiskus brisanja primarnega ključa tabele test1 ne uspe, ker je uporabljen v definiciji tujega ključa tabele test2 */
SQL> alter table test1 drop constraint integ_39;
Statement failed, SQLCODE = -607
unsuccessful metadata update
-ERASE RDB$RELATION_CONSTRAINTS failed
-action cancelled by trigger (1) to preserve data integrity
-Cannot delete PRIMARY KEY being used in FOREIGN KEY definition.
SQL>