|
Politica de confidentialitate |
|
• domnisoara hus • legume • istoria unui galban • metanol • recapitulare • profitul • caract • comentariu liric • radiolocatia • praslea cel voinic si merele da aur | |
OBIECTE in BAZELE de DATE : SECVENTIALE si INDEXATE | ||||||
|
||||||
m7t21tj Acest paragraf descrie cum se poate indexa o tabela pentru a imbunatati timpul de raspuns in cazul unei interogari. Crearea si utilizarea accesului secvential este de asemenea discutata (aceasta permite atribuirea automata de numere de secventa unice in cadrul unei aplicatii.) Generatorul de numere de secventa 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 auser.i sequence_name a increment by ni a start with ni a maxvalue n | nomaxvalue i a minvalue n | nominvalue i
Toti parametrii comenzii sunt optionali si au urmatoarea semnificatie: user: proprietarul secventei.Implicit este user-ul care a generat comanda CREATE
SEQUENCE sequence_name: numele de secventa care respecta conventiile SQL de denumire
a obiectelor Urmatoarea comanda creaza o secventa pentru coloana DEPTNO a tabelei DEPT. CREATE SEQUENCE dept_sep INCREMENT BY 10 START WITH 10 MAXVALUE 10000; Dupa ce o secventa a fost creata ea poate fi folosita pentru a genera numere unice de secventa. Generarea de numere de secventa cu NEXTVAL FROM SYS.DUAL ;; NEXTVAL ------------- 10 Daca se reexecuta comanda SQL anterioara valoarea creste cu 10. SELECT dept_seq.NEXTVAL FROM SYS.DUAL ;; NEXTVAL ------------- 20 Prima valoare obtinuta este 10 si aceasta se incrementeaza apoi cu pasul 10.
intodeauna se prefixeaza NEXTVAL cu numele de secventa daca se refera NEXTVAL de mai multe ori pentru o singura comanda SQL orice referire va intoarce aceasi valoare. NEXTVAL este foarte folositoare in comenzi DML. De exemplu cind se completeaza o tabela se poate folosi o secventa pentru a produce valori unice pentru coloana cu cheii primare a tabelei. Exemplul urmator foloseste secventa dept_seq pentru a adauga cheii primare unice in tabela DEPT. INSERT INTO DEPT VALUES (dept_seq.NEXTVAL, 'ACCOUNTING', `NEW YORK'); 1 record created SQL> SELECT * FROM DEPT; DEPTNO DNAME LOC ------------ -------------- ------------------ 10 ACCOUNTING NEW YORK Inaintea versiunii 6, numere unice de secventa erau generate la nivelul aplicatiilor.
De exemplu, o modalitate obisnuita de implementare este de a forta fiecare tranzactie
sa blocheze tabela cu numarul de secventa sa incrementeze secventa si apoi sa
elibereze resursa. In aceasta implementare, numai un singur numar de secventa
poate fi generat la un moment dat. Generatorul de numere de secventa ORACLE
permite generarea simultana a multiple numere de secventa de catre useri diferiti.
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 Reguli de folosire NEXTVAL si CURRVALNEXTVAL si CURRVAL pot fi folosite in cadrul: clauza SELECT dintr-o declaratie SELECT (exceptie la afisari) lista VALUES dintr-o declaratie INSERT clauza SET dintr-o declaratie UPDATE in afara SELECT intr-o lista SELECT din VIEW impreuna cu cuvintul cheie DISTINCT cu clauzele ORDER BY, GROUP BY, CONNECT BY, sau HAVING dintr-o declaratie SELECT cu operatorii UNION, INTERSECT, MINUS Secventele sunt tratate in mod similar cu tabelele si pot fi modificate sau abandonate. Proprietarul unei secvente poate de asemenea atribui privilegii si altor useri asupra secventei. Modificarea unei Secvente aINCREMENT BY ni aMAXVALUE n | NOMAXVALUEi aMINVALUE n | NOMINVALUEi De exemplu pentru a seta o noua valoare maxima pentru secventa dept_deq, ALTER SEQUENCE dept_seq maxvalue 100000 Pentru a modifica o secventa este necesar sa fii proprietarul eu sau sa ai
dreptul DBA sau sa fi primit dreptul ALTER pentru secventa din partea proprietarului.
Numai secventele viitoare vor fi influientate de catre comanda ALTER SEQUENCE Sunt facute anumite verificari. De exemplu o noua MAXVALUE nu poate impune care este mai mica decit numarul de secventa curent Valoarea START WITH nu poate fi schimbata folosint comanda ALTER SEQUENCE Secventa trebuie abandonata si recreata pentru a reporni secventa la un numar diferit. Atribuirea drepturilor asupra Secventelor 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. Stergerea unei Secvente Trebuie sa fii proprietarul secventei sau sa ai dreptul de DBA pentru a o sterge.
DROP SEQUENCE sept_seq; Tiparirea SecventelorToate 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 Pentru a accelera afisarea liniilor cu o cheie particulara. Folosirea indexarii este puternic recomandata pentru a obtine performante mai
bune. Retineti ca ORACLE 7 creiaza automat INDEXI pentru coloanele care au setate
PRIMARY KEY sau UNIQUE. 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. Structura unui INDEX ORACLE Tipuri de INDEX 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. Crearea unui IndexIndex ORACLE poate fi creat in linia de comanda cu comanda CREATE INDEX. CREATE aUNIQUEi INDEX index_name ON table (column ami...) Crearea unui INDEX pentru a imbunatati timpul de raspunsPentru 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); Crearea unui INDEX pentru a asigura unicitateaIndecsi 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); Index-ul urmator asigura unicitatea valorii introduse in tabela SHIPMENTS.
CREATE UNIQUE INDEX ORDER ON SHIPMENTS (S_Num, P_Num); Stergerea unui INDEXPentru a sterge definitia unui index din tabela de date , introduceti: DROP INDEX indexname; Cind este folosit un INDEX ? 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. Reguli de folosire al unui index Indexii de pe coloane trebuie adresati in clauza WHERE: SELECT ENAME,JOB,SAL,COMM FROM EMP;
Urmatoarea indetogare va folosi un index pe coloana ENAME: SELECT * FROM EMP WHERE ENAME = 'JHONES'; Un index nu va fi folosit daca coloana referita in clauza WHERE face parte dintr-o expresie sau functie. Exemplul urmator nu foloseste index deoarece coloana este parte a unei functii: SELECT * FROM EMP WHERE UPPER(ENAME)= 'JHONES';
In mod similar daca HIREDATE a fost indexata, aceasta interogare nu va folosi index deoarece este o expresie: SELECT * FROM EMP WHERE HIREDATE+7 = '01-JAN-84'; Utilizarea indexarii functie de cost 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. Sugestii pentru INDEXARE De exemplu: SELECT ENAME, DNAMEFROM DEPT, EMP WHERE EMP.DEPTNO = DEPT.DEPTNO Daca numai EMP.DEPTNO este indexata , atunci DEPT este tabela conducatoare.
Acest lucru este normal deoarece DEPT intoarce mai multe linii decit EMP. Daca
ambele sunt indexate, Oracle alege tabela conducatoare cintarind rangurile celor
doua sisteme. Daca rangurile sunt egale atunci Oracle alege tabela care este
listata ultima in clauza FROM. FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO Unit 18 ExercitiiCreati un indice neunic in coloana Projid a tabelei de atribuire. Interogati tabela DDT (data dictionary table) pentru a obtine informatii despre indexii folositi (USER_INDEXES). Solutii: CREATE INDEX ASG_PROJID ON ASSIGNMENTS (PROJID); SELECT TABE_NAME, INDEX_NAMEFROM USER_INDEXES; |
||||||
|
||||||
|
||||||
Copyright© 2005 - 2024 | Trimite document | Harta site | Adauga in favorite |
|