Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 11

SQL performance Tunning.

This refers to database Optimization.

we can use stored objects such as.


1. sequences
2. Views
3. Index
4. Synonyims.

==SEQUENCES.
You can use sequences to automatically generate unique integers OR CIRCLED
INTEGERS.

a sequence can run out of values. if used at all.

supose we need to create a sequence with intergers from 1 to 20.

CREATE SEQUENCE mySequence


MINVALUE
MAXVALUE
START WITH
INCREMENT BY
CACHE
circle;

CREATE SEQUENCE LABB1


MINVALUE 1
MAXVALUE 20
START WITH 2
INCREMENT BY 1
CACHE 5;

Sequence created.

if you want to use values from the sequence.

syntax

sequencename.nextval

eg.

select LABB1.nextval from dual;

SQL> select LABB1.nextval from dual;

NEXTVAL
----------
2

SQL> /

NEXTVAL
----------
3
if the sequence runs out of data, you can perform alter.

ALTER SEQUENCE SEQUENCENAME


MAXVAL 30

ALTER SEQUENCE LABB1


MAXVALUE 60
/

Sequence altered.

SQL> select LABB1.nextval from dual;

NEXTVAL
----------
21

SUPOSE WE HAVE TABLE CALLED EMP, WE HAVE NEW REQUIREMENT THAT


ALL EMPLOYEES MUST BE GIVEN ANOTHER UNIQUE VALUE.

ALTER TABLE EMP ADD EMPID NUMBER(3);


EMPNO ENAME SAL EMPID
---------- ------- ---------- ----------
7369 SMITH 800
7499 ALLEN 1600
7521 WARD 1250
7566 JONES 2975
7654 MARTIN 1250
7698 BLAKE 2850
7782 CLARK 2450
7788 SCOTT 3000
7839 KING 5000
7844 TURNER 1500
7876 ADAMS 2450

EMPNO ENAME SAL EMPID


---------- ------- ---------- ----------
7900 JAMES 2850
7902 FORD 3000
7934 MILLER 1300
123 Juma
163 Juma
165 Juma

NOW, WE NEED TO GIVE EACH EMPLOYEE A UNIQUE ID CALLED EMPID.


STARTING FROM 5 TO 30

UPDATE EMP SET EMPID=LABB1.NEXTVAL;

SQL> UPDATE EMP SET EMPID=HABIBLAB1.NEXTVAL;

17 rows updated.

SQL> SELECT EMPNO,ENAME,SAL,EMPID FROM EMP;

EMPNO ENAME SAL EMPID


---------- ------- ---------- ----------
7369 SMITH 800 31
7499 ALLEN 1600 32
7521 WARD 1250 33
7566 JONES 2975 34
7654 MARTIN 1250 35
7698 BLAKE 2850 36
7782 CLARK 2450 37
7788 SCOTT 3000 38
7839 KING 5000 39
7844 TURNER 1500 40
7876 ADAMS 2450 41

EMPNO ENAME SAL EMPID


---------- ------- ---------- ----------
7900 JAMES 2850 42
7902 FORD 3000 43
7934 MILLER 1300 44
123 Juma 45
163 Juma 46
165 Juma 47

CREATE SEQUENCE LABB2


MINVALUE 5
MAXVALUE 20
START WITH 7
INCREMENT BY 3
CACHE 5
CYCLE;

UPDATE EMP SET EMPID=LABB2.NEXTVAL;

SQL> SELECT EMPNO,ENAME,SAL,EMPID FROM EMP;

EMPNO ENAME SAL EMPID


---------- ------- ---------- ----------
7369 SMITH 800 1
7499 ALLEN 1600 4
7521 WARD 1250 7
7566 JONES 2975 10
7654 MARTIN 1250 13
7698 BLAKE 2850 16
7782 CLARK 2450 19
7788 SCOTT 3000 1
7839 KING 5000 4
7844 TURNER 1500 7
7876 ADAMS 2450 10

EMPNO ENAME SAL EMPID


---------- ------- ---------- ----------
7900 JAMES 2850 13
7902 FORD 3000 16
7934 MILLER 1300 19
123 Juma 1
163 Juma 4

CREATE SEQUENCE StudentNumSeq


INCREMENT BY 5
START WITH 7
MAXVALUE 99
NOCACHE
CYCLE;

Sequence created.

.................................................................
VIEWS
STORED OBJECT WHICH USED TO CREATE DIFFERENT WINDOWS( ACCESS) OF DATA DEPENDING
ON USER CATEGORY.

EG.

CREATE VIEW VLABB1 AS


SELECT *
FROM emp
WHERE DEPTNO=20;

SQL> SELECT EMPNO,ENAME,SAL,DEPTNO FROM VLABB1;

EMPNO ENAME SAL DEPTNO


---------- ------- ---------- ----------
7369 SMITH 800 20
7566 JONES 2975 20
7788 SCOTT 3000 20
7876 ADAMS 2450 20
7902 FORD 3000 20

SQL> INSERT INTO VLABB1(EMPNO,ENAME,DEPTNO) VALUES(80,'GERY',30);

1 row created.

SQL> SELECT ENAME,DEPTNO FROM VLABB1;

ENAME DEPTNO
---------- ----------
SMITH 20
PAUL 20
GERY 20
SCOTT 20
ADAMS 20
FORD 20

6 rows selected.

SQL> SELECT ENAME,DEPT FROM EMP;


SELECT ENAME,DEPT FROM EMP
*
ERROR at line 1:
ORA-00904: "DEPT": invalid identifier

SQL> SELECT ENAME,DEPTNO FROM EMP;

ENAME DEPTNO
---------- ----------
SMITH 20
ALLEN 30
WARD 30
PAUL 20
MARTIN 30
BLAKE 30
GERY 20
SCOTT 20
GERY 30
TURNER 30
ADAMS 20

ENAME DEPTNO
---------- ----------
JAMES 30
FORD 20

13 rows selected.
=================================

CREATE VIEW VLABB2 AS


SELECT EMPNO,SAL
FROM emp
WHERE DEPTNO=20;

CREATE VIEW VLABB2 AS


SELECT EMPNO,SAL
FROM emp
WHERE DEPTNO=20 AND JOB='CLERK';

View created.

SQL> SELECT*FROM VLABB2;

EMPNO SAL
---------- ----------
7369 800
7876 2850

SUPOSE, ACCOUNTNT WISH TO ADD 20% SALARY.

UPDATE VLABB2 SET SAL=SAL*0.2+SAL;

SQL> SELECT*FROM VLABB2;

EMPNO SAL
---------- ----------
7369 960
7876 3420

SQL> SELECT EMPNO,ENAME,SAL,JOB FROM EMP WHERE JOB='CLERK';


EMPNO ENAME SAL JOB
---------- ---------- ---------- ---------
7369 SMITH 960 CLERK
7876 ADAMS 3420 CLERK
7900 JAMES 2975 CLERK

SQL> SELECT ENAME,EMPNO,SAL,DEPTNO FROM EMP WHERE DEPTNO=20;

ENAME EMPNO SAL DEPTNO


------- ---------- ---------- ----------
SMITH 7369 960 20
JONES 7566 3570 20
SCOTT 7788 3600 20
ADAMS 7876 2940 20
FORD 7902 3600 20

SQL> SELECT*FROM HABIBACCNT;

EMPNO SAL
---------- ----------
7369 960
7566 3570
7788 3600
7876 2940
7902 3600

NOTE: RECORDED CHANGES (VALUES) WEHER AUTOMATICALLY REFLECTED TO EMP TABLE.

CREATE VIEW HABIB5 AS


SELECT EMPNO,SAL,DEPTNO
FROM emp
WHERE DEPTNO=20;

UPDATE HABIBACCNT SET SAL=SAL*0.1+SAL;

ASSUME UPDATION OF SALARY TO EMPLOYEES WITH A DEPTNO 10.


UPDATE HABIB5 SET SAL=SAL*0.1+SAL WHERE DEPTNO=10;

Creating a View with a CHECK OPTION Constraint

CREATE VIEW HABIB6 AS


SELECT ENAME,SAL,JOB
FROM emp
WHERE SAL <2000
WITH CHECK OPTION CONSTRAINT HB1;

View created.

ADD RECORD

INSERT INTO HABIB6(ENAME,SAL,JOB) VALUES('HABIBA',1500,'TECHN');

SQL> SELECT ENAME,SAL FROM HABIB6;


ENAME SAL
---------- ----------
SMITH 960
ALLEN 1600
WARD 1250
MARTIN 1250
TURNER 1500
HABIBA 1500

7 rows selected.

SQL> SELECT ENAME,SAL FROM EMP;

ENAME SAL
---------- ----------
SMITH 960
ALLEN 1600
WARD 1250
PAUL 2975
MARTIN 1250
BLAKE 2850
GERY
SCOTT 3000
GERY
TURNER 1500
ADAMS 3420

ENAME SAL
---------- ----------
JAMES 2975
FORD 3000
HABIBA 1500

INSERT INTO HABIB6(ENAME,SAL,JOB) VALUES('SALAH',2500,'ACCNT');


*
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation

SELECT ENAME,SAL FROM HABIB6;


SQL> SELECT ENAME,SAL FROM HABIB6;

ENAME SAL
---------- ----------
SMITH 960
ALLEN 1600
WARD 1250
MARTIN 1250
TURNER 1500
HABIBA 1500

SELECT ENAME,SAL FROM EMP;


ENAME SAL
---------- ----------
SMITH 960
ALLEN 1600
WARD 1250
PAUL 2975
MARTIN 1250
BLAKE 2850
GERY
SCOTT 3000
GERY
TURNER 1500
ADAMS 3420

ENAME SAL
---------- ----------
JAMES 2975
FORD 3000
HABIBA 1500

==== Creating a View with a READ ONLY Constraint


CREATE VIEW HABIB7 AS
SELECT ENAME,SAL,DEPTNO
FROM emp WHERE DEPTNO=20 AND HIREDATE<'12/DEC/1982'
WITH READ ONLY CONSTRAINT HB3;

SQL> SELECT*FROM HABIB7;

ENAME SAL DEPTNO


---------- ---------- ----------
SMITH 960 20
PAUL 2975 20
SCOTT 3000 20
FORD 3000 20

INSERT INTO HABIB7 VALUES('HAMIS',465,20);


ERROR at line 1:
ORA-42399: cannot perform a DML operation on a read-only view

SELECT*FROM HABIB7;
ENAME SAL DEPTNO
---------- ---------- ----------
SMITH 960 20
PAUL 2975 20
SCOTT 3000 20
FORD 3000 20

INSERT INTO EMP(ENAME,SAL,DEPTNO) VALUES('HAJI',465,20);

insert into HABIB7(empno,ename,sal,JOB) values(2435,'Kiran',365,'Clerk');

View created.
ERROR at line 1:
ORA-42399: cannot perform a DML operation on a read-only view

SQL> DELETE FROM HABIB7;


DELETE FROM HABIB7
*
ERROR at line 1:
ORA-42399: cannot perform a DML operation on a read-only view
=======Index.

What is an Index?

An index is a performance-tuning method of allowing faster retrieval of records. An


index creates an entry for each value that appears in the indexed columns. By
default, Oracle creates B-tree indexes.
Create an Index

The syntax for creating a index is:

CREATE [UNIQUE] INDEX index_name


ON table_name (column1)
[ COMPUTE STATISTICS ];

UNIQUE indicates that the combination of values in the indexed columns must be
unique.

COMPUTE STATISTICS tells Oracle to collect statistics during the creation of the
index. The statistics are then used by the optimizer to choose a "plan of
execution" when SQL statements are executed.
For Example:

CREATE INDEX supplier_idx


ON supplier (supplier_name);

CREATE INDEX HABIBINDEX


ON EMP(HIREDATE);

CREATE INDEX HABIBINDEX2


ON EMP(HIREDATE,ENAME)
COMPUTE STATISTICS;

WHEN YOU RUN QUERY CONTAINING SPECIFIED COLUMN.


THE INDEX WILL AUTOMATICALLY RUN TO SPEED UP THE QUERY.

SELECT HIREDATE,ENAME FROM EMP WHERE HIREDATE='22/MAR/2001';

In this example, we've created an index on the supplier table called supplier_idx.
It consists of only one field - the supplier_name field.

We could also create an index with more than one field as in the example below:

CREATE INDEX supplier_idx


ON supplier (supplier_name, city);

We could also choose to collect statistics upon creation of the index as follows:

CREATE INDEX supplier_idx


ON supplier (supplier_name, city)
COMPUTE STATISTICS;
Create a Function-Based Index

In Oracle, you are not restricted to creating indexes on only columns. You can
create function-based indexes.

The syntax for creating a function-based index is:

CREATE [UNIQUE] INDEX index_name


ON table_name (function1, function2, . function_n)
[ COMPUTE STATISTICS ];
For Example:

CREATE INDEX supplier_idx


ON supplier (UPPER(supplier_name));

In this example, we've created an index based on the uppercase evaluation of the
supplier_name field.

However, to be sure that the Oracle optimizer uses this index when executing your
SQL statements, be sure that UPPER(supplier_name) does not evaluate to a NULL
value. To ensure this, add UPPER(supplier_name) IS NOT NULL to your WHERE clause as
follows:

SELECT supplier_id, supplier_name, UPPER(supplier_name)


FROM supplier
WHERE UPPER(supplier_name) IS NOT NULL
ORDER BY UPPER(supplier_name);

Rename an Index

The syntax for renaming an index is:

ALTER INDEX index_name


RENAME TO new_index_name;
For Example:

ALTER INDEX supplier_idx


RENAME TO supplier_index_name;

In this example, we're renaming the index called supplier_idx to


supplier_index_name.
Collect Statistics on an Index

If you forgot to collect statistics on the index when you first created it or you
want to update the statistics, you can always use the ALTER INDEX command to
collect statistics at a later date.

The syntax for collecting statistics on an index is:

ALTER INDEX index_name


REBUILD COMPUTE STATISTICS;
For Example:

ALTER INDEX supplier_idx


REBUILD COMPUTE STATISTICS;

In this example, we're collecting statistics for the index called supplier_idx.
Drop an Index
The syntax for dropping an index is:

DROP INDEX index_name;


For Example:

DROP INDEX supplier_idx;

In this example, we're dropping an index called supplier_idx.

You might also like