Size of partition on interval range partitioned Table happens when SYSDATE is used in a Where Clause

We have tables interval range partitioned on a DATE, with a partition for each day column - very standard and straight out of doc Oracle.

A 3rd party application queries the tables to find the number of rows based on the date range that is located on the column used for the partition key.

This application uses the date range specified from the current date - i.e. for last two days would be «...» StartDate > SYSDATE-2 "- but the partition size is irrelevant and the explain command plan shows that each partition is included."

In presenting the request uses the date in a variable partition size location and query table is obviously much better.

DB is 11.2.0.3 on RHEL6, and default settings - i.e. nothing that could influence the behavior of the optimizer to something unusual.

I can't work on why this would be the case. It is very easy to reproduce with cases of simple test below.

I would be very interested to hear any views on why it's that way and if anything can be done to allow the size of the partition to work with a query including SYSDATE because it would be difficult to get the application code has changed.

In addition to make a case to change the code, I need an explanation of why query using SYSDATE is not advisable and I know this information.

(1) create a simple partitioned table

CREATETABLE part_test
   (id                      NUMBER NOT NULL,
    starttime               DATE NOT NULL,
    CONSTRAINT pk_part_test PRIMARY KEY (id)) 
PARTITION BY RANGE (starttime) INTERVAL (NUMTODSINTERVAL(1,'day')) (PARTITION p0 VALUES LESS THAN (TO_DATE('01-01-2013','DD-MM-YYYY')));

(2) fill in the rows of the table 1 million distributed among 10 partitions

BEGIN
    FOR i IN 1..1000000
    LOOP
        INSERT INTO part_test (id, starttime) VALUES (i, SYSDATE - DBMS_RANDOM.value(low => 1, high => 10));
    END LOOP;
END;
/
EXEC dbms_stats.gather_table_stats('SUPER_CONF','PART_TEST');

(3) to query the Table of data from the last 2 days using SYSDATE in paragraph

EXPLAIN PLAN FOR 
SELECT  count(*) 
FROM    part_test
WHERE   starttime >= SYSDATE - 2;

-------------------------------------------------------------------------------------------------------

| ID | Operation | Name | Lines | Bytes | Cost (% CPU). Time | Pstart. Pstop |

-------------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT |           |     1.     3 ×  7895 (1) | 00:00:01 |       |       |

|   1.  GLOBAL TRI |           |     1.     3 ×            |          |       |       |

|   2.   RANGE OF PARTITION ITERATOR.           |   111K |   867K |  7895 (1) | 00:00:01 |   KEY | 1048575.

|*  3 |    TABLE ACCESS FULL | PART_TEST |   111K |   867K |  7895 (1) | 00:00:01 |   KEY | 1048575.

-------------------------------------------------------------------------------------------------------

Information of predicates (identified by the operation identity card):

---------------------------------------------------

3 - filter("STARTTIME">=SYSDATE@!-2)

(4) now do the same query, but with SYSDATE - 2 presented as a literal value.

This query returns the same response but very different cost.

EXPLAIN PLAN FOR
SELECT count(*) 
FROM part_test
WHERE starttime >= (to_date('23122013:0950','DDMMYYYY:HH24MI'))-2;

-------------------------------------------------------------------------------------------------------

| ID | Operation | Name | Lines | Bytes | Cost (% CPU). Time | Pstart. Pstop |

-------------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT |           |     1.     8.   131 (0) | 00:00:01 |       |       |

|   1.  GLOBAL TRI |           |     1.     8.            |          |       |       |

|   2.   RANGE OF PARTITION ITERATOR.           |   111K |   867K |   131 (0) | 00:00:01 |   356 . 1048575.

|*  3 |    TABLE ACCESS FULL | PART_TEST |   111K |   867K |   131 (0) | 00:00:01 |   356 | 1048575.

-------------------------------------------------------------------------------------------------------

Information of predicates (identified by the operation identity card):

---------------------------------------------------

3 filter ("STARTTIME" > = TO_DATE (' 2013-12-21 09:50 ',' syyyy-mm-dd hh24:mi:ss'))))

Thank you in anticipation

Jim

sysdate is not constant and its value may change from time optimization of execution; but the optimizer can deduce that he will be a known running value and then produce a plan that will make the size of partition running.  This is the meaning of 'KEY' in the column pstart – the partition of departure will be known at run time and the size of partition will take place in order to eliminate the previous partitions.

Concerning

Jonathan Lewis

Tags: Database

Similar Questions

  • Create no partition Table partitioning

    Dear all,

    I have a table that is not partition, and it has about 20 G data... If I want that table with say DATE_M partition column

    Please can anyone suggest the best way to do it.

    Thank you

    To create a partitioned table

    (1) you must make a backup of the existing one you can take expdp or DEC

    (2) remove the table and create the same table now with partitions (a minimum score is required)

    you want a range of ex-based partition if you use a date column

    (3) loading data from the previous table into the new partitioned table, either by DEC or impdp, the inserts will be automatically in their respective partitions and you don't mention explicitly.

    Their is no other possible way to partition a non partitioned table, you can do than workarounds to minimize the downtime of the table trying different ways to load data into the partitioned table.

    You can use the enable row movement clause of create table and also use local indexes for easy maintenance partition.

  • [db housekeep] what is better with partition tables or not?

    Hi man s/n... I'm still a beginner on this junior dba currently career. I would like to ask you for your expertise.
    My question is if there is a table with the number of records which varies from 15 million a month, what is the best way to implement the household?

    Currently, the table is not partitioned. Wouldn't be better if the table that is needed to be housekeep be recreated as a table with partitions?
    What are the advantages and disadvantages?

    Thanks a lot :)

    Edited by: user992972 Oct 6, 2010 18:29

    The best way is to ignore it. 15 M record is not even worth thinking about.

    Now ask me about 150 M record? Same answer.

    Household is the result of written business rule requirements or dealing with issues of specific settings which can be demonstrated by showing identifiable problems. If you spend a minute if worry lines sitting idly in a table, not worrying about anyone, you wasted a minute.

    As for whether a table should be partitioned requires to understand how it is used. What is happening? What is out? The WHERE clause. If the size of partition would make a difference.

    The partitioning option costs money and well worth it if it provides value. It provides no value just because it exists.

    Are you a junior DBA if please go to this link and believes, as I do, one of the most valuable lessons, you can learn to be a DBA.
    http://www.battleagainstanyguess.com/BAAG/

  • modify an existing table to selectively the partition interval range

    I'm using Oracle 11.2.0.3.

    I have an existing table that has parition interval range.

    example:
     
    create table Log( ts date, level  varchar2(20), scr varchar2(2000))PARTITION BY RANGE (TS)
    INTERVAL( NUMTODSINTERVAL(1,'DAY'))
    Currently, we have the log of the table that is the partition of the range by day and we drop old parition to a week. However, we want to change this to persist the records in the table of WHICH = LEVEL "IMPORTANT."

    What is the best way to achieve this?

    >
    Is it possible to modify the existing interval partition table to add partition in the list?
    >
    Only using the DBMS_REDEFINITION to do online. And that always involves the creation of a "provisional" table

    If you have a window of failure just to create a new partitioned table the way you want to and INSERT the data into it. You should be able to use a DEC to do if you want. You may not use swap partition since all data must be physically moved.
    >
    Can we do list-interval partition table i.e. (with partition interval as partition sup)?
    >
    No - subpartitioning of interval is not currently supported.

    Here is the code example of a partitioned table by using the RANGE-interval LIST. It uses a VIRTUAL column, but you can ignore it for your use case

    DROP TABLE mytable;
    
    CREATE TABLE mytable
    (
    CREATION_DATE TIMESTAMP(6),
    LAST_MODIFIED_DATE TIMESTAMP(6),
    CREATION_DAY NUMBER(2) GENERATED ALWAYS AS (TO_NUMBER(TO_CHAR(CREATION_DATE, 'DD'))) VIRTUAL
    )
    PARTITION BY RANGE (LAST_MODIFIED_DATE) INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
    SUBPARTITION BY LIST (CREATION_DAY)
       SUBPARTITION TEMPLATE
       ( SUBPARTITION days_1_5 VALUES (1,2,3,4,5)
       , SUBPARTITION days_6_10 VALUES (6,7,8,9,10)
       , SUBPARTITION days_11_15 VALUES (11,12,13,14,15)
       , SUBPARTITION days_16_20 VALUES (16,17,18,19,20)
       , SUBPARTITION days_21_25 VALUES (21,22,23,24,25)
       , SUBPARTITION days_26_31 VALUES (26,27,28,29,30,31)
       )
    (
       PARTITION prior_to_2013 VALUES LESS THAN (TO_DATE('2013-01-01', 'YYYY-MM-DD'))
    )
    
  • Try to convert the partitioned Table of interval in the range... Swap partition...

    Requirement:

    Interval of replacement partitioned Table by range partitioned Table
    DROP TABLE A;
    
    CREATE TABLE A
    (
       a              NUMBER,
       CreationDate   DATE
    )
    PARTITION BY RANGE (CreationDate)
       INTERVAL ( NUMTODSINTERVAL (30, 'DAY') )
       (PARTITION P_FIRST
           VALUES LESS THAN (TIMESTAMP ' 2001-01-01 00:00:00'));
    
    
    INSERT INTO A
         VALUES (1, SYSDATE);
    
    INSERT INTO A
         VALUES (1, SYSDATE - 30);
    
    INSERT INTO A
         VALUES (1, SYSDATE - 60);
    I need to change this partitioned Table apart to a partitioned range Table. I can do using the EXCHANGE PARTITION. Like if I use the classic method to create another table range partitioned, then:

    DROP TABLE A_Range
    CREATE TABLE A_Range
    (
    a NUMBER,
    CreationDate DATE
    )
    PARTITION BY RANGE (CreationDate)
       (partition MAX values less than (MAXVALUE));
    
    Insert  /*+ append */  into A_Range Select * from A; --This Step takes very very long..Trying to cut it short using Exchange Partition.
    Problems:

    I can't do
     ALTER TABLE A_Range
      EXCHANGE PARTITION MAX
      WITH TABLE A
      WITHOUT VALIDATION;
     
    ORA-14095: ALTER TABLE CHANGE requires a not partitioned table nonclustered
    This is because the tables are partitioned. So it does not allow me.

    If I instead:


    Create a table that is not partitioned for exchanging data by partition.
      Create Table A_Temp as Select * from A;
      
       ALTER TABLE A_Range
      EXCHANGE PARTITION MAX
      WITH TABLE A_TEMP
      WITHOUT VALIDATION;
       
      select count(*) from A_Range partition(MAX);
     
    -The problem is that all the data is in MAX Partition.
    Even after the creation of a large number of partitions by walls of separation, the data is still in MAX Partition only.

    So:

    -What we cannot replace a partitioned Table to the Table partitioned using the EXCHANGE PARTITION range interval. that is, we have to insert in...
    -We can do it, but I'm missing something here.
    -If all the data is in MAX Partition due to "WITHOUT VALIDATION", can say us be redistributed in the right type of range partitions.

    You must pre-create the partitions in a_range and then swap one for one for a tmp, and then to arange. With the help of your sample (thanks to proviing code, incidentally).

    SQL> CREATE TABLE A
      2  (
      3     a              NUMBER,
      4     CreationDate   DATE
      5  )
      6  PARTITION BY RANGE (CreationDate)
      7     INTERVAL ( NUMTODSINTERVAL (30, 'DAY') )
      8     (PARTITION P_FIRST
      9         VALUES LESS THAN (TIMESTAMP ' 2001-01-01 00:00:00'));
    
    Table created.
    
    SQL> INSERT INTO A VALUES (1, SYSDATE);
    
    1 row created.
    
    SQL> INSERT INTO A VALUES (1, SYSDATE - 30);
    
    1 row created.
    
    SQL> INSERT INTO A VALUES (1, SYSDATE - 60);
    
    1 row created.
    
    SQL> commit;
    
    Commit complete.
    

    You can find the form of existing partitions assistance:

    SQL> select table_name, partition_name, high_value
      2  from user_tab_partitions
      3  where table_name = 'A';
    
    TABLE_NAME PARTITION_NAME HIGH_VALUE
    ---------- -------------- --------------------------------------------------------------------------------
    A          P_FIRST        TO_DATE(' 2001-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
    A          SYS_P44        TO_DATE(' 2013-01-28 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
    A          SYS_P45        TO_DATE(' 2012-12-29 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
    A          SYS_P46        TO_DATE(' 2012-11-29 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
    

    You can then create the table a_range with apporopriate partitions. Note that you may need to create additional in a_range partitions because the partitioning interval does not create the partitions has no data for, even if that leaves 'holes' in the partitioning scheme. So, on that basis:

    SQL> CREATE TABLE A_Range (
      2     a NUMBER,
      3     CreationDate DATE)
      4  PARTITION BY RANGE (CreationDate)
      5     (partition Nov_2012 values less than (to_date('30-nov-2012', 'dd-mon-yyyy')),
      6      partition Dec_2012 values less than (to_date('31-dec-2012', 'dd-mon-yyyy')),
      7      partition Jan_2013 values less than (to_date('31-jan-2013', 'dd-mon-yyyy')),
      8      partition MAX values less than (MAXVALUE));
    
    Table created.
    

    Now, create a regular table to use in the constituencies:

    SQL> CREATE TABLE A_tmp (
      2     a              NUMBER,
      3     CreationDate   DATE);
    
    Table created.
    

    and all partitions in Exchange:

    SQL> ALTER TABLE A
      2    EXCHANGE PARTITION sys_p44
      3    WITH TABLE A_tmp;
    
    Table altered.
    
    SQL> ALTER TABLE A_Range
      2    EXCHANGE PARTITION jan_2013
      3    WITH TABLE A_tmp;
    
    Table altered.
    
    SQL> ALTER TABLE A
      2    EXCHANGE PARTITION sys_p45
      3    WITH TABLE A_tmp;
    
    Table altered.
    
    SQL> ALTER TABLE A_Range
      2    EXCHANGE PARTITION dec_2012
      3    WITH TABLE A_tmp;
    
    Table altered.
    
    SQL> ALTER TABLE A
      2    EXCHANGE PARTITION sys_p46
      3    WITH TABLE A_tmp;
    
    Table altered.
    
    SQL> ALTER TABLE A_Range
      2    EXCHANGE PARTITION nov_2012
      3    WITH TABLE A_tmp;
    
    Table altered.
    
    SQL> select * from a;
    
    no rows selected
    
    SQL> select * from a_range;
    
             A CREATIOND
    ---------- ---------
             1 23-NOV-12
             1 23-DEC-12
             1 22-JAN-13
    

    John

  • Creating a partitioned table to an existing table interval.

    Hello

    Is there a way I can create a partitioned table interval of an existing table using DEC? I know how to create a partitioned table in range.

    create the table range_partitioned_table

    partition by range (date_column)

    (

    partition p1 lower ((to_date (' 08/01/2012 ',' mm/dd/yyyy'))),

    lower partition p2 values (to_date (' 09/01/2012 ',' mm/dd/yyyy')),

    PN VALUES LESS THAN (MAXVALUE) PARTITION

    )

    AS SELECT * from existing_table;

    Is there a similar way to the Interval partition an existing table?

    create the table interval_partitioned_table

    partition by range (date_column)

    interval (provide the interval)

    (

    partition p1 lower ((to_date (' 08/01/2012 ',' mm/dd/yyyy'))),

    partition p2 values less (to_date (' 09/01/2012 ',' mm/dd/yyyy')),

    -PN SCORE VALUES LESS THAN (MAXVALUE)

    )

    AS SELECT * from existing_table;

    For example:

    SQL > create table interval_partitioned_table
    2 partition by range (hiredate)
    interval of 3 (numtoyminterval(1,'YEAR'))
    (4)
    5 score below p1 ((to_date (' 08/01/2012 ',' mm/dd/yyyy'))),
    6 partition p2 values less (to_date (' 09/01/2012 ',' mm/dd/yyyy')),
    7 - PARTITION pN VALUES LESS THAN (MAXVALUE)
    8)
    9 AS SELECT * FROM emp;

    Table created.

    SQL >

    SY.

  • Possible to Exchange temporary table with composite range-hash partitioned table?

    Hello

    Using oracle 11.2.0.3

    We want to clean up the data in some of our existing partitioned table.

    Afetr updates check spped that is too slow for us.

    Current table is partitioned the inetrval compoiste range-hash table.  Also it is compressed - enabled for compression of basis as well

    An interval of 1 month and 1 partition by month and 4 secondary partitions in the partition of ecah.

    You want to create tenp table with the data of celan and exchange the data in this table in the 'dirty' uisng existing partitions partition exchnage.

    Is this possible?

    The plan is

    1) create temporary table containing data for 1 partition (1 month worth of data)

    (2) clean the data here

    (3) create new temporary table with these specific data which compressed and discovered partitioned with 4 secondary partitions

    (4) table 3 for swap partition dirty using partition excahnge.

    Thaks

    I think that this can be done with a combination of Exchange and Split partition partitions. Prior to Oracle 11 g, only way of redefining tables online was DBMS_REDEFINITION package. Now, you can redefine the use of partitions for Exchange & Split. Check

    http://www.Oracle-base.com/articles/Misc/partitioning-an-existing-table-using-Exchange-partition.php

    Maintenance of Partitions

    Kind regards

  • TIMESTAMP (6) partitioned key-> range partitioned table ddl needed

    What is the DDL TIMESTAMP syntax (6) partitioned key, range partitioned table

    Published by: oracletune on January 11, 2013 10:26

    >
    What is the DDL TIMESTAMP syntax (6) partitioned key, range partitioned table
    >
    Don't know what you're asking. Are you asking how to create a table partitioned using a TIMESTAMP column (6) for the key?

    CREATE TABLE TEST1
    (
        USERID                 NUMBER,
        ENTRYCREATEDDATE     TIMESTAMP(6)
    )
    PARTITION BY RANGE (ENTRYCREATEDDATE) INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
    (
        PARTITION P0 VALUES LESS THAN (TO_DATE('1-1-2013', 'DD-MM-YYYY'))
    )
    

    See my answer posted: January 10, 2013 21:56 if you need to do on a TIMESTAMP with TIME ZONE column. You must add a virtual column.
    Creating scores of auto range

  • importing into a partitioned table of interval 11g

    as I took export utility simple partition table 8i exp not rained so 100 k lines in there.

    and imported with the import utility in the interval of 11g partitioned based on the date column.

    There were imported, but did not what I expected...

    If we execute the simple insert for partition interval 11g command, it create new partition automatically according to the strategy of partition.

    Here's the demo...

    created range partitioned table on the date with shift interval column...

    CREATE TABLE TEST.xxx_HIST
    (
    xxx_DATE DATE NOT NULL,
    P_ROLL_CONVENTION CHAR (2),
    R_ROLL_CONVENTION CHAR (2),
    P_COMPOUNDING_IND CHAR (2),
    R_COMPOUNDING_IND CHAR (2),
    P_CALC_METHOD CHAR (2),
    R_CALC_METHOD CHAR (2),
    P_SPREAD_AMT NUMBER (28,12).
    R_SPREAD_AMT NUMBER (28,12).

    )
    partition by range (xxx_DATE)
    interval (numtoyminterval(3,'MONTH'))
    store (security)
    (
    values of pQ1 lower partition (to_date('2010-01-01','yyyy-mm-dd'))
    ) IN PARALLEL.


    -IMPORTED FROM ROWS IN THE TABLE...

    ======================================================================
    Connected to: Oracle Database 11 g Enterprise Edition Release 11.1.0.7.0 - 64 bit Production
    With partitioning, OLAP, Data Mining and Real Application Testing options

    Export file created by EXPORT: V08.01.07 direct

    CAUTION: objects have been exported by SYSTEM, not by you

    . import of xx_ARCH in TEST objects
    . . import of 141749 lines imported from the table 'xxx_HIST '.
    Import completed successfully without warnings.
    ========================================================================



    -HE HAS A LOT OF DATES OF DIFF IN THERE...



    SQL > SELECT COUNT (DISTINCT xxx_DATE) TEST.xxx_HIST;

    COUNT (DISTINCT xxx_DATE)
    -----------------------------
    1371


    28-MARCH 06
    10 FEBRUARY 06
    9 FEBRUARY 05
    20 FEBRUARY 02
    3 JUNE 02
    10 MAY 04
    26 DECEMBER 03
    31 JANUARY 03

    xxx
    ---------
    21 JULY 08
    31 OCTOBER 05
    25 APRIL 08
    28 APRIL 08
    12 OCTOBER 06
    DECEMBER 21 07
    28 DECEMBER 04


    -BUT STILL ALL DUMPED INTO A PARTITION


    SQL > SELECT nom_partition FROM DBA_TAB_PARTITIONS WHERE TABLE_OWNER = 'TEST ';

    NOM_PARTITION
    ------------------------------
    PQ1

    It all dumped in a partition...

    fact partition interval 11g creates the partition automatically in function whose lines if imported... when we import lines in there...? or am I missing something?

    any idea guys?

    Seems to be a poor strategy for me because if I am not mistaken, there is no way to specify the order of the imported lines. If you import a line with the date max as your first row... bang, you get a range partition created for you and the rest falling.

    I think you'd be better import these data into a table in step and then by a

    insert into new_fancy_partition_table
    select *
    from old_8_temporary_imported_table
    order by date_column asc
    

    Or create the partitions manually.

    I just realized that you specify a partition in your create table statement (missed that on cursory inspection). And I think you misunderstand how the interval works... it's for values LARGER than the existing partitions ONLY...

    http://download.Oracle.com/docs/CD/E11882_01/server.112/e10592/statements_7002.htm#SQLRF01402

    "
    INTERVAL clause

    Use this clause to set the interval of partitioning the table. Range partitions are partitions based on a digital range interval or datetime. * They extend from range partitioning by commanding the database to automatically create partitions of the specified range or interval when the data inserted in the table exceed all the partitions.* range
    "

    Published by: Tubby on August 16, 2010 18:32

    Additional document link.

  • Disable LOGGING for partition table based on the automatic INTERVAL

    Hello

    I created a database table of paritioned range interval with NOLOGGING as the default attribute for the table as well as the tablespace definition.

    When ORACLE automatically creates a new partition for this table, it activates the LOGGING for this automatic partition even if the table definition says anything else.

    How can I go about changing this behavior? Is it still possible?

    FYI my platform is 11 GR 1 (11.1.0.7) material on SUN SOLARIS 10 SPARC.

    Any help will be appreciated.

    Right, so refer to a new feature of Oracle 11 g partitioning called 'partitioning interval. "

    +"+
    + The interval partitioning: A new strategy of partitioning in Oracle Database 11g, +.
    + Interval partitioning extends the functionality of the method range to define equipartitioned +.
    + ranges using a definition of the interval. Rather than specify individual +.
    + going to explicitly, Oracle will create any partition automatically as needed.
    + every time the data of a partition are inserted for the first time. Interval +.
    + a lot of partitioning improves maneuverability of a partitioned table. For +.
    example, + a partitioned table interval could be set so that Oracle creates a +.
    + new partition for each month in a calendar year; a partition is then automatically +.
    + created for "September 2007" as soon as the first record in this month is inserted.
    + in the database. +
    + The techniques available for a partitioned table interval are interval, interval-+.
    + List, range-Hash, and interval range. +
    +"+

    In order to disable interval partitioning on the transactions table, use:
    
    ALTER TABLE transactions SET INTERVAL ();
    

    http://download.Oracle.com/docs/CD/B28359_01/server.111/b32024/part_admin.htm

    Disable partitioning interval on this table, create a procedure to run every day we'll say, to create a new partition and chop the old partition of the appropriate table. I presume that the automatic partitioning interval creates the partition with the logging by default option without checking the parameters in the table. I have seen no information on this in the Oracle documentation.

    Hope that helps.

    Ogan

  • Adding a Partition to a range-Hash partitioned Table

    Hello

    I created the composite partition table (RANGE-HASH).  Oracle: 11.2, OS: HP UX

    CREATE TABLE 'XYZ '. "" TABLE_XYZ.

    (

    ----

    VARCHAR2 (54) "PROFILE" DEFAULT "000000000000000000' ENABLE NON-NULL"

    NUMBER (21.7) "CREATED_ON" DEFAULT 0 ENABLE NOT NULL,.

    ----

    )

    PARTITION BY RANGE

    (

    CREATED_ON

    )

    SUBPARTITION BY HASH

    (

    VIEW PROFILE

    )

    SUBPARTITION TEMPLATE

    (

    SUBPARTITION SP1 TABLESPACE PSAPISU,

    SUBPARTITION TABLESPACE PSAPISU SP2,

    SUBPARTITION SP3 TABLESPACE PSAPISU,

    SUBPARTITION SP4 TABLESPACE PSAPISU,

    SUBPARTITION SP5 TABLESPACE PSAPISU,

    SUBPARTITION SP6 TABLESPACE PSAPISU,

    SUBPARTITION SP7 TABLESPACE PSAPISU,

    SUBPARTITION SP8 TABLESPACE PSAPISU,

    SUBPARTITION SP9 TABLESPACE PSAPISU,

    SUBPARTITION SP10 TABLESPACE PSAPISU,

    SUBPARTITION SP11 TABLESPACE PSAPISU,

    SUBPARTITION SP12 TABLESPACE PSAPISU,

    SUBPARTITION SP13 TABLESPACE PSAPISU,

    SUBPARTITION SP14 TABLESPACE PSAPISU,

    SUBPARTITION SP15 TABLESPACE PSAPISU,

    SUBPARTITION SP16 TABLESPACE PSAPISU,

    SUBPARTITION SP17 TABLESPACE PSAPISU,

    SUBPARTITION SP18 TABLESPACE PSAPISU,

    SUBPARTITION SP19 TABLESPACE PSAPISU,

    SUBPARTITION SP20 TABLESPACE PSAPISU,

    SUBPARTITION SP21 TABLESPACE PSAPISU,

    SUBPARTITION SP22 TABLESPACE PSAPISU,

    SUBPARTITION SP23 TABLESPACE PSAPISU,

    SUBPARTITION SP24 TABLESPACE PSAPISU,

    SUBPARTITION SP25 TABLESPACE PSAPISU

    )

    (

    CREATED_ON_OCP01 PARTITION VALUES LESS THAN (20090101000000).

    CREATED_ON_OCP02 PARTITION VALUES LESS THAN (20090401000000).

    CREATED_ON_OCP03 PARTITION VALUES LESS THAN (20090701000000).

    CREATED_ON_OCP04 PARTITION VALUES LESS THAN (20091001000000).

    CREATED_ON_OCP05 PARTITION VALUES LESS THAN (20100101000000).

    CREATED_ON_OCP06 PARTITION VALUES LESS THAN (20100401000000).

    CREATED_ON_OCP07 PARTITION VALUES LESS THAN (20100701000000).

    CREATED_ON_OCP08 PARTITION VALUES LESS THAN (20101001000000).

    CREATED_ON_OCP09 PARTITION VALUES LESS THAN (20110101000000).

    CREATED_ON_OCP10 PARTITION VALUES LESS THAN (20110401000000).

    CREATED_ON_OCP11 PARTITION VALUES LESS THAN (20110701000000).

    CREATED_ON_OCP12 PARTITION VALUES LESS THAN (20111001000000).

    CREATED_ON_OCP13 PARTITION VALUES LESS THAN (20120101000000).

    CREATED_ON_OCP14 PARTITION VALUES LESS THAN (20120401000000).

    CREATED_ON_OCP15 PARTITION VALUES LESS THAN (20120701000000).

    CREATED_ON_OCP16 PARTITION VALUES LESS THAN (20121001000000).

    CREATED_ON_OCP17 PARTITION VALUES LESS THAN (20130101000000).

    CREATED_ON_OCP18 PARTITION VALUES LESS THAN (20130401000000).

    CREATED_ON_OCP19 PARTITION VALUES LESS THAN (20130701000000).

    CREATED_ON_OCP20 PARTITION VALUES LESS THAN (20131001000000).

    CREATED_ON_OCP21 PARTITION VALUES LESS THAN (20140101000000).

    CREATED_ON_OCP22 PARTITION VALUES LESS THAN (20140401000000).

    CREATED_ON_OCP23 PARTITION VALUES LESS THAN (20140701000000).

    CREATED_ON_OCP24 PARTITION VALUES LESS THAN (20141001000000).

    CREATED_ON_OCP25 PARTITION VALUES LESS THAN (20150101000000).

    PARTITION CREATED_ON_OCPMAX VALUES LESS THAN (MAXVALUE)

    )

    TABLESPACE "PSAPISU" ENABLE LINE MOVEMENT;

    Now, I am trying to add the new partition but becomes under errors:

    ALTER TABLE SAPISU. ADD PARTITION VALUES LESS THAN (20150401000000) CREATED_ON_OCP26 ZTMD_300_VERS_MANAGE

    *

    ERROR on line 1:

    ORA-14074: partition bound must gather greater than that of the last partition

    ERROR on line 1:

    ORA-14018: partition bound list contains too few elements

    I tried the SYNTAX mentioned by Oracle DOC, still getting error. Partitioned table and index management

    Could if it you please let me know, what is the exact syntax that I should follow?

    See you soon

    Sameer

    CREATED_ON_OCPMAX PARTITION SPLIT THAN (MAXVALUE)

    That don't mean to 'divide' the MAXVALUE partition.

    You cannot split a partition that contains the values of A, B, C, D, MAXVALUE to MAXVALUE; that makes no sense. ERROR on line 1:

    ORA-14080: partition cannot be split along the specified high limit

    That exception is to say you can't use MAXVALUE upper limit. You must use a value that is actually IN the partition.

    Go back and look at the definition of your partitions:

    CREATED_ON_OCP25 PARTITION VALUES LESS THAN (20150101000000).

    PARTITION CREATED_ON_OCPMAX VALUES LESS THAN (MAXVALUE)

    See which ends with: "VALUES LESS THAN (MAXVALUE)? MAXVALUE is not IN the score; This is the upper limit of the partition.

    Divide certain value > '20150101000000' and LESS THAN MAXVALUE;

    So if you try to create a partition for OCP26 you can use '20160101000000'.

    CREATE TABLE PART_TEST2)
    VARCHAR2 (54) DEFAULT PROFILE "000000000000000000' ENABLE NOT NULL,
    CREATED_ON NUMBER (21.7) DEFAULT 0 ENABLE NOT NULL
    )
    PARTITION BY RANGE (CREATED_ON)
    (
    CREATED_ON_OCP24 PARTITION VALUES LESS THAN (20141001000000).
    CREATED_ON_OCP25 PARTITION VALUES LESS THAN (20150101000000).
    PARTITION CREATED_ON_OCPMAX VALUES LESS THAN (MAXVALUE)
    )

    ALTER table split partition created_on_ocpmax part_test2
    to (20160101000000) into (partition, partition CREATED_ON_OCPMAX created_on_ocp26)

  • Unique key on the partitioned table range

    Hello

    We use a range of composite range-hash partitioned table

    Use index - try to do this have same tablespace to the local partitions but not liking it

    ALTER table RETAILER_TRANSACTION_COMP_POR
    Add primary key constraint RETAILER_TRANSACTION_COMP_PK (DWH_NUM)
    using index
    LOCAL


    ORA-14039: partitioning columns must be a subset of the columns in a unique index key

    Without local then fine but does not have same tablespace to walls and don't want to make this part of the partition key.

    Range Tbal partitioned - it's just a UK to avoid duplicates
    [oracle@localhost ~]$ oerr ora 14039
    14039, 00000, "partitioning columns must form a subset of key columns of a UNIQUE index"
    // *Cause:  User attempted to create a UNIQUE partitioned index whose
    //          partitioning columns do not form a subset of its key columns
    //          which is illegal
    // *Action: If the user, indeed, desired to create an index whose
    //          partitioning columns do not form a subset of its key columns,
    //          it must be created as non-UNIQUE; otherwise, correct the
    //          list of key and/or partitioning columns to ensure that the index'
    //          partitioning columns form a subset of its key columns
    
  • How to find the size of the partitioned tables?

    How to find the size of the partitioned tables?

    Select nom_segment, sum (bytes) /(1024*1024) 'Size in MB' from dba_segments
    where owner = 'owner name' and segment_type like '% PARTITION % '.
    Group by nom_segment;

  • I need to change the column of the range on my partition table

    Hello

    I created a partition table, but I need to change column of the range "CREATED" to "PREPARED". Two of them date format, but I can't modify this table.

    PARTITION OF RANGE (CREATED)--> I need to change column "CREATED" as "PREPARED".
    (
    INV08 PARTITION VALUES LESS (TO_DATE('01-SEP-2010','DD-MON-YYYY')).
    INV09 PARTITION VALUES LESS (TO_DATE('01-OCT-2010','DD-MON-YYYY')).
    INV10 PARTITION VALUES LESS (TO_DATE('01-NOV-2010','DD-MON-YYYY')).
    PARTITION INV VALUES LESS THAN (MAXVALUE)
    )

    How can I do?

    Published by: user567352 on December 23, 2010 04:10

    Hello

    As far as I know, dbms_redefinition didn't even know about the partitioning:

    1. you create a new empty table that matches your need + (that is where you defined you new partition key) +.
    2. you start the names of submiting of redefinition of existing and newly created table 'interim' table
    3. you leave enough time to get the work done
    4. you have finished redefining (the name of the table are swapped)
    And voila!

    Be sure to test thorougly the process of redefinition and the performance impact that may occur until you make it to your production !
    ;-)

  • Partitioning of an existing partitioned table

    Dear Experts,

    I have a problem with redefinition of partitioning of an existing partitioned table. I have a parent table separated by a virtual column by range:

    CREATE THE PARENT TABLE

    (

    PARENT_ID NUMBER NOT NULL,

    INSERT_TIMESTAMP TIMESTAMP (6) NOT NULL,

    CLOB PARENT_DATA NOT NULL,

    BATCH NUMBER,

    DATE of INSERT_DATE generated always as (TRUNC("INSERT_TIMESTAMP"))

    )

    LOB (PARENT_DATA) AS STORE NAVIGATION (ACTIVATE ONLINE STORAGE)

    PARTITION BY RANGE (INSERT_DATE)

    (

    P2015_11 PARTITION VALUES LESS THAN (TO_DATE (' 2015-12-01 00:00:00 ',' SYYYY-MM-DD HH24:MI:SS ',' NLS_CALENDAR = GREGORIAN '))

    CRAFT STORE (PARENT_DATA) AS (SECUREFILE

    ACTIVATE THE ONLINE STORAGE),

    P2015_12 PARTITION VALUES LESS THAN (TO_DATE (' 2016-01-01 00:00:00 ',' SYYYY-MM-DD HH24:MI:SS ',' NLS_CALENDAR = GREGORIAN '))

    CRAFT STORE (PARENT_DATA) AS (SECUREFILE

    ACTIVATE THE ONLINE STORAGE),

    P2016_01 PARTITION VALUES LESS THAN (TO_DATE (' 2016-02-01 00:00:00 ',' SYYYY-MM-DD HH24:MI:SS ',' NLS_CALENDAR = GREGORIAN '))

    CRAFT STORE (PARENT_DATA) AS (SECUREFILE

    ALLOW ONLINE STORAGE,

    PARTITION P_DEFAULT VALUES LESS THAN (MAXVALUE)

    CRAFT STORE (PARENT_DATA) AS (SECUREFILE

    ALLOW ONLINE STORAGE

    ))

    );

    and a child table partitioned by reference:

    CREATE ACCOUNTS FROM THE TABLE. CHILD

    (

    PARENT_ID NUMBER NOT NULL,

    DATAACC DATAACC_TBL,

    CREATION_DATE DATE,

    CONSTRAINT PARENT_D_E_PRT_FK

    FOREIGN KEY (PARENT_ID)

    (PARENT_ID) REFERENCES PARENT

    ENABLE VALIDATE

    )

    NESTED TABLE, STORE DATAACC AS DATAACC_NT

    PARTITION OF REFERENCE (PARENT_D_E_PRT_FK)

    (

    P2015_11 PARTITION,

    P2015_12 PARTITION,

    P2016_01 PARTITION,

    PARTITION P_DEFAULT);

    However, now in Oracle 12 c I am able to use the reference interval partitioning. How can I redefine the partitioning of the parent table so that there can be scope-level?

    Thank you for your help.

    Best regards, Atanas.

    To change range partition to partition interval, the table should not have MAXVALUE partition... Follow the steps below to convert to partition interval

    (1) check if all data of the MAXVALUE partition (p_default) using query below

    SELECT COUNT (*) FROM parent PARTITION (p_default).

    (2) if there is no trace in the p_default partition, drop the help below

    ALTER TABLE DROP PARTITION parent p_default;

    (3) use the clause SET INTERVAL to convert the range partition partition interval as below

    ALTER TABLE parent SET INTERVAL (NUMTOYMINTERVAL(1,'MONTH'));

    I guess, you have the range partition up to until, so there should not be any folder in p_default partition.

Maybe you are looking for