--PARTITION
--PARTITIONING ALLOWS TABLE,INDEX AND INDEX_ORGANIZED TABLES TO SUB DIVIDED INTO
SMALLER PIECES,
--ENABLING THOSE DATABASE OBJECT TO BE MANAGED AND ACCESSED AT A FINER LEVEL OF
GRANULARITY.
--WHY WE USE PARTITION?
--WHEN WE ARE TAKING 30% ABOVE DATA .
--INDEX WILL BE INEFFECTIVE (INDEX ONLY USED FOR LESS THAN 4% DATA OUTPUT)
--FULL TABLE SCAN WILL TAKE WAY TOO MUCH TIME.
--ADVANTAGES
--FULL PARTITION SCAN (LESS DATA,MUCH FASTER).
--THEN OUR PERFORMANCE SIGNIFICANTLY IMPROVE.
--PAARTITION IS IMPROVEMENT OF PERFORMANCE WHEN HANDLING HUGE AMOUNT OF DATA(2GB)
--(ANY TABLE BIGGER THEN 2GB)
--TYPES
--LIST/REGION PARTITION -- (WE CAN GIVE NUMBER AND VARCHAR2 DATA TYPE)
--RANGE PARTITION --(WE CAN GIVE NUMBER AND DATE DATA TYPE)
--HASH PARTITION --(WHICH COLUMNS DOESN'T CREATE RANGE AND LIST THEN WE
CREATE HASH PARTITION.)
--ENABLE ROW MOVEMENT
--ITS USED FOR WHEN WE UPDATE PARTITION COLUMN IN FUTURE SO THAT'S WHY WE USE
ENABLE ROW MOVEMENT.
--OTHERWISE ROW MOVEMENT IS NOT POSSIBLE .(ERROR OCCURED).
-----------------------------------------------------------------------------------
-----------------------
-->RANGE PARTITION (WE CAN GIVE NUMBER AND DATE DATA TYPE)
CREATE TABLE EMP (EMP_ID NUMBER,NAME VARCHAR2(30),SALARY NUMBER,DEPT_ID
NUMBER,HIRE_DATE DATE)
PARTITION BY RANGE (SALARY) INTERVAL (1000)
--INTERVAL IS OPTIONAL
(
PARTITION P1 VALUES LESS THAN (1000),
PARTITION P2 VALUES LESS THAN (2000),
PARTITION P3 VALUES LESS THAN (3000)
)ENABLE ROW MOVEMENT;
SELECT*FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='EMP';
ALTER TABLE EMP ADD PARTITION P4 VALUES LESS THAN (4000);
--ORA-14760: ADD PARTITION IS NOT PERMITTED ON INTERVAL PARTITIONED OBJECTS
--BCOZ WHEN WE GIVE SALARY <=3000 THEN IT'S TAKE SYSTEM GENERATED PARTITION.
INSERT INTO EMP VALUES (100,'SUNDAR',3000,10,'01-FEB-21'); --PARTITION P4 CREATE
LIKE SYS_NAME
INSERT INTO EMP VALUES (100,'RAJ',2000,20,'01-APR-21'); --ITS P3 PARTITION.
SELECT*FROM EMP PARTITION (P3);
SELECT*FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='EMP';
SELECT TABLE_NAME,PARTITION_NAME,SUBPARTITION_COUNT,TABLESPACE_NAME FROM
USER_TAB_PARTITIONS WHERE TABLE_NAME ='EMP';
DELETE FROM EMP WHERE HIRE_DATE='01-APR-21'; --ITS DELETE FROM MAIN TABLE ALSO
PARTITION TABLE BUT PARTITION P3 IS AVAILABALE .
---------->
CREATE TABLE EMP1(EMP_ID NUMBER,NAME VARCHAR2(30),SALARY NUMBER,DEPT_ID
NUMBER,HIRE_DATE DATE)
PARTITION BY RANGE (SALARY)
(
PARTITION P1 VALUES LESS THAN (10000),
PARTITION P2 VALUES LESS THAN (15000),
PARTITION P3 VALUES LESS THAN (20000)
);
SELECT*FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='EMP1';
SELECT TABLE_NAME,PARTITION_NAME,SUBPARTITION_COUNT,TABLESPACE_NAME FROM
USER_TAB_PARTITIONS WHERE TABLE_NAME ='EMP1';
ALTER TABLE EMP1 ADD PARTITION P4 VALUES LESS THAN (25000);
SELECT*FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='EMP1';
INSERT INTO EMP1 VALUES (104,'SURYA',30000,40,'01-APR-21');
--ORA-14400: inserted partition key does not map to any partition ORA-06512: at
"SYS.DBMS_SQL", line 1721
--OUR SALARY COLUMN ONLY IN P4 --25000.
------------>
POSSIBLE OPERATIONS WITH RANGE PARTITION
*ADD-->ALTER TABLE EMPLOYEES ADD PARTITION P5 VALUES LESS THAN (50);
*DROP-->ALTER TABLE EMPLOYEES DROP PARTITION P4;
*TRUNCATE-->ALTER TABLE EMPLOYEES TRUNCATE PARTITION P6;
*RENAME -->ALTER TABLE EMPLOYEES RENAME PARTITION P3 TO P4;
*MOVE-->ALTER TABLE EMPLOYEES MOVE APRTITION P21 TABLESPACE SYSAUX;
*SPLIT -->WE HAVE PARTITION P2 VALUE 10 TO 20 NOW,
--ALTER TABLE EMPLOYEES SPLIT PARTITION P2 AT(15) INTO (PARTITION
P21,PARTITION P22);
*EXCHANGE-->TABLE TO TABLE (NON PARTITIONED TABLE) -->ALTER TABLE EMPLOYEES
EXCHANGE PARTITION P21 WITH TABLE EMPLOYEES2;
-->NON PARTITIONED ONLY EXCHANGING DATA(P).
-----------------------------------------------------------------------------------
------------------------------------------
-->LIST PARTITION ( WE CAN GIVE NUMBER AND VARCHAR2 DATA TYPE )
CREATE TABLE EMP2 (EMP_ID NUMBER,NAME VARCHAR2(30),SALARY NUMBER,DEPT_ID
NUMBER,HIRE_DATE DATE)
PARTITION BY LIST (DEPT_ID)
(
PARTITION P1 VALUES (10,20,30),
PARTITION P2 VALUES (40,50,60),
PARTITION P3 VALUES (70,80,90)
);
SELECT*FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='EMP2';
SELECT TABLE_NAME,PARTITION_NAME,SUBPARTITION_COUNT,TABLESPACE_NAME FROM
USER_TAB_PARTITIONS WHERE TABLE_NAME ='EMP2';
CREATE TABLE EMP3 (EMP_ID NUMBER,NAME VARCHAR2(30),SALARY NUMBER,DEPT_ID
NUMBER,HIRE_DATE DATE,CITY VARCHAR2(30))
PARTITION BY LIST (CITY)
(
PARTITION P1 VALUES ('CHENNAI','MADURAI'),
PARTITION P2 VALUES ('KOVAI','TRICHY'),
PARTITION P3 VALUES ('CHIDAMBARAM','VELUR')
);
SELECT*FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='EMP3';
SELECT TABLE_NAME,PARTITION_NAME,SUBPARTITION_COUNT,TABLESPACE_NAME FROM
USER_TAB_PARTITIONS WHERE TABLE_NAME ='EMP3';
-----------------------------------------------------------------------------------
--------------
-->HASH PARTITION (WHICH COLUMN DOESN'T CREATE RANGE AND LIST THEN WE CREATE HASH
PARTITION.)
CREATE TABLE EMP4(EMP_ID NUMBER,NAME VARCHAR2(30),SALARY NUMBER,DEPT_ID
NUMBER,HIRE_DATE DATE,CITY VARCHAR2(30))
PARTITION BY HASH (EMP_ID)
PARTITION 4;
SELECT*FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='EMP4';
SELECT TABLE_NAME,PARTITION_NAME,SUBPARTITION_COUNT,TABLESPACE_NAME FROM
USER_TAB_PARTITIONS WHERE TABLE_NAME ='EMP4';
-----------------------------------------------------------------------------------
------------
DOUBTS
ALTER TABLE EMP1 MODIFY PARTITION P3 VALUES LESS THAN (23000);