Continuing our investigation of the FBDA architecture.
So, although my active table (TEST_FBDA) is not partitioned, the History table is Range Partitioned on the ENDSCN column, with a single partition ! All the rows in the History table are in the MAXVALUE partition. I wonder if and when it will ever be split ?
What if I create a partitioned table and then define Flashback Archiving on it ?
So, even though my active table (TEST_FBDA_PARTITIONED) is created as a Range Partitioned Table partitioned on ID_COLUMN, the corresponding History table is Range Partitioned on ENDSCN with a single MAXVALUE partition.
Therefore, Oracle ignores my partitioning definition when creating the History table. The History table (seems to be ?) always Range Partitioned on ENDSCN and starts using the MAXVALUE partition up-front. (When will this Partition be split ? I could search MoS for Docs / Bugs, but I'll do that exercise later).
Now that we know that the History table doesn't use our Partition Key, we must wonder about Partition Pruning when running AS OF queries on the active table that need to access the History Table. If we can't Partition Prune, can we Index the History table ?
Yes ! Oracle does allow us to build custom indexes on the History tables. (I believe I saw this somewhere in the documentation or a note).
Next Post (possibly) : More DML operations and whether auto-purging based on the defined RETENTION 3 DAY period. (Note : The Retention Period is defined at the Flashback Archive level, not at the individual table (active/History) level. If you need to have tables with different Retention Periods, you need to define different Flashback Archives, although they can all be in the same Tablespace).
.
.
.
oracle@ora12102 Desktop]$ sqlplus hemant/hemant SQL*Plus: Release 12.1.0.2.0 Production on Tue Apr 5 23:25:10 2016 Copyright (c) 1982, 2014, Oracle. All rights reserved. Last Successful login time: Tue Apr 05 2016 23:23:47 +08:00 Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics and Real Application Testing options SQL> select table_name, def_tablespace_name, partitioning_type, partition_count, status 2 from user_part_tables 3 order by 1; TABLE_NAME -------------------------------------------------------------------------------- DEF_TABLESPACE_NAME PARTITION PARTITION_COUNT STATUS ------------------------------ --------- --------------- -------- SYS_FBA_HIST_93250 FBDA RANGE 1 VALID SQL> SQL> set pages600 SQL> set long 10000 SQL> select dbms_metadata.get_ddl('TABLE','SYS_FBA_HIST_93250') from dual; DBMS_METADATA.GET_DDL('TABLE','SYS_FBA_HIST_93250') -------------------------------------------------------------------------------- CREATE TABLE "HEMANT"."SYS_FBA_HIST_93250" ( "RID" VARCHAR2(4000), "STARTSCN" NUMBER, "ENDSCN" NUMBER, "XID" RAW(8), "OPERATION" VARCHAR2(1), "ID_COLUMN" NUMBER, "DATA_COLUMN" VARCHAR2(15), "DATE_INSERTED" DATE, "D_1729869_NEW_COL_1" VARCHAR2(5) ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE( BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "FBDA" PARTITION BY RANGE ("ENDSCN") (PARTITION "HIGH_PART" VALUES LESS THAN (MAXVALUE) SEGMENT CREATION IMMEDIATE PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(INITIAL 8388608 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "FBDA" ) SQL>
So, although my active table (TEST_FBDA) is not partitioned, the History table is Range Partitioned on the ENDSCN column, with a single partition ! All the rows in the History table are in the MAXVALUE partition. I wonder if and when it will ever be split ?
What if I create a partitioned table and then define Flashback Archiving on it ?
SQL> create table test_fbda_partitioned ( 2 id_column number, 3 data_column varchar2(15), 4 date_inserted date) 5 partition by range (id_column) 6 (partition p_100 values less than (101), 7 partition p_200 values less than (201), 8 partition p_300 values less than (301), 9 partition p_400 values less than (401), 10 partition p_max values less than (MAXVALUE)) 11 / Table created. SQL> alter table test_fbda_partitioned flashback archive fbda; Table altered. SQL> insert into test_fbda_partitioned 2 select rownum, to_char(rownum), trunc(sysdate) 3 from dual connect by level < 701; 700 rows created. SQL> commit; Commit complete. SQL> update test_fbda_partitioned 2 set data_column=data_column; 700 rows updated. SQL> commit; Commit complete. SQL> col subobject_name format a15 SQL> select object_type, subobject_name, object_id 2 from user_objects 3 where object_name = 'TEST_FBDA_PARTITIONED' 4 order by 3,1; OBJECT_TYPE SUBOBJECT_NAME OBJECT_ID ----------------------- --------------- ---------- TABLE 93342 TABLE PARTITION P_100 93343 TABLE PARTITION P_200 93344 TABLE PARTITION P_300 93345 TABLE PARTITION P_400 93346 TABLE PARTITION P_MAX 93347 6 rows selected. SQL> SQL> select table_name 2 from user_tables 3 where table_name like '%93342%' 4 order by 1; TABLE_NAME -------------------------------------------------------------------------------- SYS_FBA_DDL_COLMAP_93342 SYS_FBA_HIST_93342 SYS_FBA_TCRV_93342 SQL> SQL> select dbms_metadata.get_ddl('TABLE','SYS_FBA_HIST_93342') from dual; DBMS_METADATA.GET_DDL('TABLE','SYS_FBA_HIST_93342') -------------------------------------------------------------------------------- CREATE TABLE "HEMANT"."SYS_FBA_HIST_93342" ( "RID" VARCHAR2(4000), "STARTSCN" NUMBER, "ENDSCN" NUMBER, "XID" RAW(8), "OPERATION" VARCHAR2(1), "ID_COLUMN" NUMBER, "DATA_COLUMN" VARCHAR2(15), "DATE_INSERTED" DATE ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE( BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "FBDA" PARTITION BY RANGE ("ENDSCN") (PARTITION "HIGH_PART" VALUES LESS THAN (MAXVALUE) SEGMENT CREATION IMMEDIATE PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(INITIAL 8388608 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "FBDA" ) SQL>
So, even though my active table (TEST_FBDA_PARTITIONED) is created as a Range Partitioned Table partitioned on ID_COLUMN, the corresponding History table is Range Partitioned on ENDSCN with a single MAXVALUE partition.
Therefore, Oracle ignores my partitioning definition when creating the History table. The History table (seems to be ?) always Range Partitioned on ENDSCN and starts using the MAXVALUE partition up-front. (When will this Partition be split ? I could search MoS for Docs / Bugs, but I'll do that exercise later).
Now that we know that the History table doesn't use our Partition Key, we must wonder about Partition Pruning when running AS OF queries on the active table that need to access the History Table. If we can't Partition Prune, can we Index the History table ?
SQL> select table_name 2 from user_tables 3 where table_name like 'SYS_FBA_HIST%' 4 / TABLE_NAME -------------------------------------------------------------------------------- SYS_FBA_HIST_93250 SYS_FBA_HIST_93342 SQL> create index sys_fba_hist_93250_ndx_1 on sys_fba_hist_93250(id_column) tablespace fbda; Index created. SQL> create index sys_fba_hist_93342_ndx_1 on sys_fba_hist_93342(id_column) tablespace fbda; Index created. SQL> select dbms_metadata.get_ddl('INDEX','SYS_FBA_HIST_93250_NDX_1') from dual; DBMS_METADATA.GET_DDL('INDEX','SYS_FBA_HIST_93250_NDX_1') -------------------------------------------------------------------------------- CREATE INDEX "HEMANT"."SYS_FBA_HIST_93250_NDX_1" ON "HEMANT"."SYS_FBA_HIST_932 50" ("ID_COLUMN") PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "FBDA" SQL> select dbms_metadata.get_ddl('INDEX','SYS_FBA_HIST_93342_NDX_1') from dual; DBMS_METADATA.GET_DDL('INDEX','SYS_FBA_HIST_93342_NDX_1') -------------------------------------------------------------------------------- CREATE INDEX "HEMANT"."SYS_FBA_HIST_93342_NDX_1" ON "HEMANT"."SYS_FBA_HIST_933 42" ("ID_COLUMN") PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "FBDA" SQL>
Yes ! Oracle does allow us to build custom indexes on the History tables. (I believe I saw this somewhere in the documentation or a note).
Next Post (possibly) : More DML operations and whether auto-purging based on the defined RETENTION 3 DAY period. (Note : The Retention Period is defined at the Flashback Archive level, not at the individual table (active/History) level. If you need to have tables with different Retention Periods, you need to define different Flashback Archives, although they can all be in the same Tablespace).
.
.
.
4 comments:
Thanks Hemant for this post.
Foued
Hi Hemant,
Once a new partition is added to the flashback tables, we are seeing that the indexes that we defined on the flashback tables are becoming unusable. As and when more and more data gets loaded into the archive tables, new partitions are created and we end-up re-building our indexes multiple times. Do you know of any way to find out when Oracle would create a new partition?
Thanks,
Anju
Anju,
Did you create the Indexes as Global (i.e. default without specifying LOCAL) Indexes ? They would become UNUSABLE at every Partition Maintenance (like ADD / SPLIT PARTITION) operation.
Have you considered LOCALly Partitioned Indexes ?
Some queries perform better with GLOBAL Indexes, other with LOCAL Indexes. So you have to evaluate how your custom queries would perform.
See https://hemantoracledba.blogspot.com/2018/08/partitioning-3a-indexes-on-partitioned.html and https://hemantoracledba.blogspot.com/2018/08/partitioning-3b-more-indexes-on.html
Hemant
Hi Hemant,
Thank you for the inputs, we are now re-creating the indexes as LOCAL.
We are also trying to figure out the condition on which Oracle automatically creates a new partition for the flashback tables. If you happen to figure this out, please share the details. Many thanks for the info on the LOCAL and GLOBAL indexes.
Thanks,
Anju
Post a Comment