Crearea si utilizarea accesului secvential este de asemenea discutata (aceasta permite atribuirea automata de numere de secventa unice in cadrul unei aplicatii.)
In server-ul Oracle versiunea 6, generatorul de numere de secventa poate fi
utilizat pentru a genera automat numere de secventa pentru rinduri in cadrul
tabelelor. De exemplu se poate folosi generatorul pentru a produce cheii
primare unice.
Pentru a genera automat numere de secventa, trebuie sa definiti o secventa
folosind comanda CREATE SEQUENCE. Sintaxa este urmatoarea:
CREATE SEQUENCE [user.] sequence_name [ increment by n] [ start with n] [ maxvalue n | nomaxvalue ] [ minvalue n | nominvalue ]
CREATE SEQUENCE dept_sep INCREMENT BY 10 START WITH 10 MAXVALUE 10000;
NEXTVAL este utilizata pentru a extrage numere de secventa succesive
dintr-o secventa specificata. Cind se acceseaza NEXTVAL on nou numar de
secventa este generat.
SELECT dept_seq.NEXTVAL FROM SYS.DUAL ;; NEXTVAL ------------- 10
SELECT dept_seq.NEXTVAL FROM SYS.DUAL ;; NEXTVAL ------------- 20
INSERT INTO DEPT VALUES (dept_seq.NEXTVAL, 'ACCOUNTING', `NEW YORK'); 1 record created SQL> SELECT * FROM DEPT; DEPTNO DNAME LOC ------------ -------------- ------------------ 10 ACCOUNTING NEW YORK
Cind un astfel de numar este generat, secventa este incrementata indiferent de tranzactiile in desfasurare. Daca doi useri acceseaza aceeasi secventa in acelasi timp, atunci fiecare user poate sa obtina eroare deoarece numere de secventa sunt de asemenea generate de al doilea user. Doi useri nu vor genera niciodata acelasi numar de secventa utilizind aceiasi secventa. Numere de secventa pot fi "sarite" daca un user nu-si termina o tranzactie sau daca aceasta sfirseste in mod anormal.
Pentru a accesa un numar de secventa care tocmai a fost generat (numarul
de secventa curent ) se foloseste pseudo-coloana CURRVAL. CURRVAL reprezinta
ultima valoare intoarsa unui program. Cind se adreseaza NEXTVAL pentru o
secventa data, numarul de secventa curent este plasat in CURRVAL.
NEXTVAL trebuie folosit pentru a genera numere de secventa in sesiunea
curenta a unui user, inainte de a putea adresa CURRVAL.
INSERT INTO DEPT_HISTORY VALUES (dept_seg.CURRVAL, 'ACCOUNTING' , `NEW YORK'); 1 record created. SQL> SELECT * FROM DEPT_HISTORY DEPTNO DNAME LOC ------------------ ------------ ----------------- 10 ACCOUNTING NEW YORK
NEXTVAL si CURRVAL pot fi folosite in cadrul:
NEXTVAL si CURRVAL nu pot fi folosite:
Se foloseste comanda ALTER SEQUENCE pentru a modifica o secventa existenta.
AKTER SEQUENCE [user.]sequence_name [INCREMENT BY n] [MAXVALUE n | NOMAXVALUE] [MINVALUE n | NOMINVALUE]
ALTER SEQUENCE dept_seq maxvalue 100000
Proprietarul unei secvente poate atribui altor useri drepturi de ALTER sau
SELECT asupra secventei, si WITH GRANT OPTION ramine valida.
Detalii in UNIT-ul 17.
Folositi comanda DROP SEQUENCE pentru a sterge o definitie de secventa.
Sintaxa este:
DROP SEQUENCE [user.]sequence_namel
DROP SEQUENCE sept_seq;
Toate definitiile secventelor sunt memorate intr-o tabela de secvente.
Pentru a vedea secventele la care ai access, interogheaza baza de date urmarind
USER_SEQUENCES sau ALL_SEQUENCES.
Indexarea in sistemul ORACLE are doua principale scopuri:
Proprietarul unei tabele poate crea indexi pentru ea. Orice user ORACLE care detine dreptul de access INDEX poate creea un index.
Odata creat, ORACLE va folosi index-ul ori de cite ori este posibil pentru a accelera accesul datelor. Acest lucru se face in mod automat si deobicei nu este necesara interventia userului care poate sa nu stie de existenta acestul index.
ORACLE foloseste arbori B pentru indexare. Timpul de access este independent de volumul de date indexat. Fiecare index construit de ORACLE contine un numar de pagini memorate in arbore. Fiecare pagina contine un numar de cheii. ORACLE gestioneaza aceasta structura la fel cum sunt inserate sau sterse linii. Valorile NULL nu sunt memorate in index, si din fericire nu ocupa spatiu. -------- Aici se afla poza de la pagina 18-9 --------
TYPE DESCRIERE ---------- ---------------------------------------------------------- UNIQUE asigura ca valorile din coloanele specificate sunt unice NON UNIQUE asigura obtinerea cit mai repede a rezultatului (implicit) SINGLE COLUMN exista numai o coloana in index CONCATENATED mai mult de 16 coloane specificate in index.
Index ORACLE poate fi creat in linia de comanda cu comanda CREATE INDEX.
CREATE [UNIQUE] INDEX index_name ON table (column [m]...)
Pentru a creea un index numit I_NAME care va fi folosit pentru a imbunatatii
timpul de interogare , introduceti:
CREATE INDEX I_ENAME ON EMP (ENAME);
Indecsi unici sunt creati automat ca un rezultat al constantelor PRIMARY KEY
sau UNIQUE in tabela. Oricum , se mai pot creea folosind comanda
CREATE UNIQUE INDEX.
Pentru a evita valori duplicate in coloana EMPNO, introduceti:
CREATE UNIQUE INDEX I_EMPNO ON EMP (EMPNO);
CREATE UNIQUE INDEX ORDER ON SHIPMENTS (S_Num, P_Num);
Pentru a sterge definitia unui index din tabela de date , introduceti:
DROP INDEX indexname;
Folosirea unui INDEX depinde in parte de optimizatorul ORACLE in momentul
executiei. ORACLE 7 permite ambele metode de optimizare SQL, functie de un
set de reguli sau functie de cost.
Oracle decide cind este adecvat sa foloseasca indexi. Oracle tine seama de coloanele indexate si de tipul indexului si decide functie de urmatoarele reguli:
SELECT ENAME,JOB,SAL,COMM FROM EMP;
SELECT * FROM EMP WHERE ENAME = 'JHONES';
SELECT * FROM EMP WHERE UPPER(ENAME)= 'JHONES';
SELECT * FROM EMP WHERE HIREDATE+7 = '01-JAN-84';
Modulul de optimizare bazat pe costul executiei decide un plan de executie pentru o secventa SQL calculind costul cailor alternative folosind informatii statistice acumulate daca este posibil. De obicei se va decide cea mai buna cale de utilizare a unui index.
Daca nu exista index in cadrul coloanelor IMBINATE atunci se poate
obtine o "sortare-imbinata". Asca inseamna ca fiecare este sortata separat
si apoi listele sortate sunt imbinate . De obicei coloanele folosite
pentru imbinari trebuie sa fie indexate. Daca numai una din tabele are un
index utilizabil, atunci cealalta tabela este tabela conducatoare.
De exemplu:
SELECT ENAME, DNAME FROM DEPT, EMP WHERE EMP.DEPTNO = DEPT.DEPTNO
Asa ca trebuie listate tabele mari cu cel mai mic numar de linii
la sfirsitul clauzei FROM.
SELECT ENAME, DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO
CREATE INDEX ASG_PROJID ON ASSIGNMENTS (PROJID);
SELECT TABE_NAME, INDEX_NAME FROM USER_INDEXES;