Understanding REFERENCE PARTITION In Oracle Database.

PRAGMA EXCEPTION_INIT

Reference partitioning is a partitioning method introduced in Oracle 11g. Using reference partitioning, a child table can inherit the partitioning characteristics from a parent table.

For REFERENCE-PARTITION,explicit PRIMARY KEY-FOREIGN KEY relationship should be present.In earlier oracle versions,if INTERVAL partitioning is created on parent table,then we cannnot create REFERENCE partitioning in child table.Oracle will throw error : ORA-14659 [Partitioning Method Of The Parent Table Is Not Supported].This is fixed in 12c.

SQL> CREATE TABLE orders
  2  (
  3   order_id NUMBER PRIMARY KEY,
  4   order_date DATE NOT NULL,
  5   customer_id NUMBER NOT NULL,
  6   shipped_id NUMBER
  7  )
  8   PARTITION BY RANGE(order_date)
  9   (
 10    PARTITION Y1 VALUES LESS THAN (TO_DATE('01-JAN-2016','DD-MON-YYYY')),
 11    PARTITION Y2 VALUES LESS THAN (TO_DATE('01-JAN-2017','DD-MON-YYYY')),
 12    PARTITION Y3 VALUES LESS THAN (TO_DATE('01-JAN-2018','DD-MON-YYYY'))
 13   );

Table created.

SQL> SELECT segment_name,blocks,bytes/1024/1024 MB FROM user_segments WHERE segment_name = 'ORDERS';

no rows selected

SQL> SELECT partition_name,num_rows FROM user_tab_partitions WHERE table_name='ORDERS';

PARTITION_NAME  NUM_ROWS
--------------- ----------
Y1
Y2
Y3

SQL> CREATE TABLE order_items
  2  (
  3   order_id NUMBER NOT NULL,
  4   product_id NUMBER NOT NULL,
  5   price NUMBER,
  6   quantity NUMBER,
  7   CONSTRAINT order_items_fk FOREIGN KEY(order_id) REFERENCES orders
  8  )
  9   PARTITION BY REFERENCE(order_items_fk);

Table created.

SQL> SELECT segment_name,blocks,bytes/1024/1024 MB FROM user_segments WHERE segment_name = 'ORDER_ITEMS';

no rows selected

SQL> SELECT partition_name,num_rows FROM user_tab_partitions WHERE table_name='ORDER_ITEMS';

PARTITION_NAME  NUM_ROWS
--------------- ----------
Y1
Y2
Y3

SQL> EXEC dbms_stats.gather_table_stats('COURSE','ORDERS');

PL/SQL procedure successfully completed.

SQL> EXEC dbms_stats.gather_table_stats('COURSE','ORDER_ITEMS');

PL/SQL procedure successfully completed.

SQL> SELECT partition_name,num_rows FROM user_tab_partitions WHERE table_name='ORDERS';

PARTITION_NAME  NUM_ROWS
--------------- ----------
Y1                 0
Y2                 0
Y3                 0

SQL> SELECT partition_name,num_rows FROM user_tab_partitions WHERE table_name='ORDER_ITEMS';

PARTITION_NAME  NUM_ROWS
--------------- ----------
Y1                 0
Y2                 0
Y3                 0

SQL> INSERT INTO orders VALUES(1,TO_DATE('31-DEC-2015','DD-MON-YYYY'),1,1);

1 row created.

SQL> INSERT INTO orders VALUES(2,TO_DATE('31-DEC-2016','DD-MON-YYYY'),2,2);

1 row created.

SQL> INSERT INTO orders VALUES(3,TO_DATE('31-DEC-2017','DD-MON-YYYY'),3,3);

1 row created.

SQL> COMMIT;

Commit complete.

SQL> INSERT INTO order_items VALUES(1,1,100,1);

1 row created.

SQL> INSERT INTO order_items VALUES(2,2,200,2);

1 row created.

SQL> INSERT INTO order_items VALUES(3,3,300,3);

1 row created.

SQL> INSERT INTO order_items VALUES(4,4,400,4);
INSERT INTO order_items VALUES(4,4,400,4)
*
ERROR at line 1:
ORA-02291: integrity constraint (COURSE.ORDER_ITEMS_FK) violated - parent key not found

SQL> COMMIT;

Commit complete.

SQL> EXEC dbms_stats.gather_table_stats('COURSE','ORDERS');

PL/SQL procedure successfully completed.

SQL> EXEC dbms_stats.gather_table_stats('COURSE','ORDER_ITEMS');

PL/SQL procedure successfully completed.

SQL> SELECT partition_name,num_rows FROM user_tab_partitions WHERE table_name='ORDERS';

PARTITION_NAME  NUM_ROWS
--------------- ----------
Y1                 1
Y2                 1
Y3                 1

SQL> SELECT partition_name,num_rows FROM user_tab_partitions WHERE table_name='ORDER_ITEMS';

PARTITION_NAME  NUM_ROWS
--------------- ----------
Y1                 1
Y2                 1
Y3                 1

SQL> SELECT * FROM orders;

  ORDER_ID ORDER_DATE CUSTOMER_ID SHIPPED_ID
---------- ---------- ----------- ----------
         1 31-DEC-15           1          1
         2 31-DEC-16           2          2
         3 31-DEC-17           3          3

SQL> SELECT * FROM orders PARTITION(Y1);

  ORDER_ID ORDER_DATE CUSTOMER_ID SHIPPED_ID
---------- ---------- ----------- ----------
         1 31-DEC-15           1          1

SQL> SELECT * FROM orders PARTITION(Y2);

  ORDER_ID ORDER_DATE CUSTOMER_ID SHIPPED_ID
---------- ---------- ----------- ----------
         2 31-DEC-16           2          2

SQL> SELECT * FROM orders PARTITION(Y3);

  ORDER_ID ORDER_DATE CUSTOMER_ID SHIPPED_ID
---------- ---------- ----------- ----------
         3 31-DEC-17           3          3

SQL> SELECT * FROM order_items;

  ORDER_ID PRODUCT_ID      PRICE   QUANTITY
---------- ---------- ---------- ----------
         1          1        100          1
         2          2        200          2
         3          3        300          3

SQL> SELECT * FROM order_items PARTITION(Y1);

  ORDER_ID PRODUCT_ID      PRICE   QUANTITY
---------- ---------- ---------- ----------
         1          1        100          1

SQL> SELECT * FROM order_items PARTITION(Y2);

  ORDER_ID PRODUCT_ID      PRICE   QUANTITY
---------- ---------- ---------- ----------
         2          2        200          2

SQL> SELECT * FROM order_items PARTITION(Y3);

  ORDER_ID PRODUCT_ID      PRICE   QUANTITY
---------- ---------- ---------- ----------
         3          3        300          3

Shoumadip Das

Hi Folks, I am Shoumadip Das hailing from Kolkata, India welcoming you to explore my blog www.oraclemasterpiece.com. I am a self motivated and successful professional working in a leading IT Giant for more than 10 years.My area of expertise includes –

  • Oracle Database Programming (SQL & PL/SQL)
  • Perl Programming
  • Unix Programming

Read More

8 thoughts on “Index Organized Tables In Oracle”

  1. Good day! Would you mind if I share your blog with my twitter group? There’s a lot of folks that I think would really appreciate your content. Please let me know. Cheers

    1. Thank you for you response.

      Please share your twitter account so that i can start sharing my content, also requesting you to please ask your friend & colleagues to subscribe my blog site for all latest updates.

      Thank You…

  2. You could definitely see your enthusiasm in the work you write. The world hopes for more passionate writers like you who are not afraid to say how they believe. At all times follow your heart. brist på järn lleme.prizsewoman.com/map11.php

  3. I have read somewhere similar point of view and I totally agree with what you said. However, there are also some other things could be mentioned on this topic, but overall I like what you described.
    In this website there is also a lot of interesting and useful information:

Leave a Reply

Your email address will not be published. Required fields are marked *