Convertendo Tabela Não Particionada Para Particionada - Oracle Database 12c R2

Olá pessoal,

A maneira de converter uma tabela em uma tabela particionada era usar o pacote DBMS_REDEFINITION (desde 9i até 12cR1), mas agora com o Oracle Database 12c Release 2, uma tabela não particionada pode ser convertida em uma tabela particionada com uma cláusula MODIFY adicionada à instrução SQL ALTER TABLE.

Além disso, a palavra-chave ONLINE pode ser especificada, permitindo operações simultâneas de DML enquanto a conversão está em andamento.

As tabelas não particionadas podem ser convertidas para a tabela particionada on-line sem qualquer tempo de inatividade para o aplicativo, ou seja, sem impacto para as atividades DML. Algumas considerações podem ser verificadas na documentação da Oracle(link no final do artigo).

Vamos a um exemplo, vamos nos conectar ao nosso banco de dados:

[oracle@serv01 ~]$ sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Wed Aug 1 16:00:03 2018

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

Vamos criar nossa tabela com base no select abaixo, repare que os usuários foram criados na base de dados a partir da data de 26 de janeiro de 2017:

SQL> col username format a30
col account_status format a20
select user_id, username, account_status, to_char(created,'dd/mm/yyyy') created from dba_users where account_status <> 'OPEN';

USER_ID USERNAME                       ACCOUNT_STATUS       CREATED
---------- ------------------------------ -------------------- ----------
8 AUDSYS                         EXPIRED & LOCKED     26/01/2017
2147483617 SYSBACKUP                      EXPIRED & LOCKED     26/01/2017
2147483618 SYSDG                          EXPIRED & LOCKED     26/01/2017
2147483619 SYSKM                          EXPIRED & LOCKED     26/01/2017
2147483620 SYSRAC                         EXPIRED & LOCKED     26/01/2017
13 OUTLN                          EXPIRED & LOCKED     26/01/2017
2147483638 XS$NULL                        EXPIRED & LOCKED     26/01/2017
21 GSMADMIN_INTERNAL              EXPIRED & LOCKED     26/01/2017
22 GSMUSER                        EXPIRED & LOCKED     26/01/2017
23 DIP                            EXPIRED & LOCKED     26/01/2017
34 REMOTE_SCHEDULER_AGENT         EXPIRED & LOCKED     26/01/2017

USER_ID USERNAME                       ACCOUNT_STATUS       CREATED
---------- ------------------------------ -------------------- ----------
35 DBSFWUSER                      EXPIRED & LOCKED     26/01/2017
39 ORACLE_OCM                     EXPIRED & LOCKED     26/01/2017
46 SYS$UMF                        EXPIRED & LOCKED     26/01/2017
54 DBSNMP                         EXPIRED & LOCKED     26/01/2017
55 APPQOSSYS                      EXPIRED & LOCKED     26/01/2017
59 GSMCATUSER                     EXPIRED & LOCKED     26/01/2017
60 GGSYS                          EXPIRED & LOCKED     26/01/2017
62 XDB                            EXPIRED & LOCKED     26/01/2017
63 ANONYMOUS                      EXPIRED & LOCKED     26/01/2017
72 WMSYS                          EXPIRED & LOCKED     26/01/2017
81 OJVMSYS                        EXPIRED & LOCKED     26/01/2017

USER_ID USERNAME                       ACCOUNT_STATUS       CREATED
---------- ------------------------------ -------------------- ----------
84 CTXSYS                         EXPIRED & LOCKED     26/01/2017
86 ORDSYS                         EXPIRED & LOCKED     26/01/2017
87 ORDDATA                        EXPIRED & LOCKED     26/01/2017
88 ORDPLUGINS                     EXPIRED & LOCKED     26/01/2017
89 SI_INFORMTN_SCHEMA             EXPIRED & LOCKED     26/01/2017
90 MDSYS                          EXPIRED & LOCKED     26/01/2017
93 OLAPSYS                        EXPIRED & LOCKED     26/01/2017
96 MDDATA                         EXPIRED & LOCKED     26/01/2017
98 SPATIAL_CSW_ADMIN_USR          EXPIRED & LOCKED     26/01/2017
1279990 DVSYS                          EXPIRED & LOCKED     26/01/2017
101 LBACSYS                        EXPIRED & LOCKED     26/01/2017

USER_ID USERNAME                       ACCOUNT_STATUS       CREATED
---------- ------------------------------ -------------------- ----------
103 DVF                            EXPIRED & LOCKED     26/01/2017

34 rows selected.

SQL>

Ok, vamos criar nossa tabela sem partição em uma tablespace que já tínhamos em nosso banco, tbs_testes:

SQL> create table table_sem_particao tablespace tbs_testes as
select user_id, username, account_status, created from dba_users where account_status <> 'OPEN'; 

Table created.

SQL>

SQL> desc table_sem_particao;
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
USER_ID                                   NOT NULL NUMBER
USERNAME                                  NOT NULL VARCHAR2(128)
ACCOUNT_STATUS                            NOT NULL VARCHAR2(32)
CREATED                                   NOT NULL DATE

SQL>

Legal! Veja que a tabela não é particionada, coluna [partitioned]:

SQL> col owner for a13
col table_name for a30
select owner, table_name, partitioned from dba_tables where table_name='TABLE_SEM_PARTICAO';

OWNER         TABLE_NAME                     PAR
------------- ------------------------------ ---
SYS           TABLE_SEM_PARTICAO             NO

SQL>

Agora nosso pulo do gato. Vamos modificar e converter nossa tabela para uma tabela particionada, simples assim:

SQL> alter table sys.table_sem_particao modify
partition by range (created)
(partition par_2017_p01 values less than (to_date('26/01/2017', 'dd/mm/yyyy')),
partition par_2017_p02 values less than (to_date('26/02/2017', 'dd/mm/yyyy')),
partition par_outros values less than (maxvalue)) online; 

Table altered.

Após isso, consulte novamente e veja que sua tabela foi particionada:

SQL> col owner for a13
col table_name for a30
select owner, table_name, partitioned from dba_tables where table_name='TABLE_SEM_PARTICAO';

OWNER         TABLE_NAME                     PAR
------------- ------------------------------ ---
SYS           TABLE_SEM_PARTICAO             YES

SQL>

Confira as partições que foram criadas:

SQL> col partition_name for a25
col high_value for a100
select partition_name, high_value from dba_tab_partitions where table_name='TABLE_SEM_PARTICAO'; 

PARTITION_NAME            HIGH_VALUE
------------------------- ----------------------------------------------------------------------------------------------------
PAR_2017_P01              TO_DATE(' 2017-01-26 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
PAR_2017_P02              TO_DATE(' 2017-02-26 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
PAR_OUTROS                MAXVALUE

SQL>

Agora se consultarmos os dados de nossa tabela pelas partições que criamos, veja o resultado.
Repare que a consulta da primeira partição par_2017_p01 não nos trouxe dado algum, pois, as informações que existem foram cadastradas com data a partir de 26/01/2017 e todas as informações desta data não entram nesta partição, e sim abaixo desta data:

SQL> select user_id, username, account_status, created from table_sem_particao partition (par_2017_p01);

no rows selected

SQL>

Mas se consultarmos a partição: par_2017_p02, obteremos o retorno dos dados:

SQL> select user_id, username, account_status, created from table_sem_particao partition (par_2017_p02);

USER_ID USERNAME                       ACCOUNT_STATUS       CREATED
---------- ------------------------------ -------------------- ---------
8 AUDSYS                         EXPIRED & LOCKED     26-JAN-17
2147483617 SYSBACKUP                      EXPIRED & LOCKED     26-JAN-17
2147483618 SYSDG                          EXPIRED & LOCKED     26-JAN-17
2147483619 SYSKM                          EXPIRED & LOCKED     26-JAN-17
2147483620 SYSRAC                         EXPIRED & LOCKED     26-JAN-17
13 OUTLN                          EXPIRED & LOCKED     26-JAN-17
2147483638 XS$NULL                        EXPIRED & LOCKED     26-JAN-17
21 GSMADMIN_INTERNAL              EXPIRED & LOCKED     26-JAN-17
22 GSMUSER                        EXPIRED & LOCKED     26-JAN-17
23 DIP                            EXPIRED & LOCKED     26-JAN-17
34 REMOTE_SCHEDULER_AGENT         EXPIRED & LOCKED     26-JAN-17

USER_ID USERNAME                       ACCOUNT_STATUS       CREATED
---------- ------------------------------ -------------------- ---------
35 DBSFWUSER                      EXPIRED & LOCKED     26-JAN-17
39 ORACLE_OCM                     EXPIRED & LOCKED     26-JAN-17
46 SYS$UMF                        EXPIRED & LOCKED     26-JAN-17
54 DBSNMP                         EXPIRED & LOCKED     26-JAN-17
55 APPQOSSYS                      EXPIRED & LOCKED     26-JAN-17
59 GSMCATUSER                     EXPIRED & LOCKED     26-JAN-17
60 GGSYS                          EXPIRED & LOCKED     26-JAN-17
62 XDB                            EXPIRED & LOCKED     26-JAN-17
63 ANONYMOUS                      EXPIRED & LOCKED     26-JAN-17
72 WMSYS                          EXPIRED & LOCKED     26-JAN-17
81 OJVMSYS                        EXPIRED & LOCKED     26-JAN-17

USER_ID USERNAME                       ACCOUNT_STATUS       CREATED
---------- ------------------------------ -------------------- ---------
84 CTXSYS                         EXPIRED & LOCKED     26-JAN-17
86 ORDSYS                         EXPIRED & LOCKED     26-JAN-17
87 ORDDATA                        EXPIRED & LOCKED     26-JAN-17
88 ORDPLUGINS                     EXPIRED & LOCKED     26-JAN-17
89 SI_INFORMTN_SCHEMA             EXPIRED & LOCKED     26-JAN-17
90 MDSYS                          EXPIRED & LOCKED     26-JAN-17
93 OLAPSYS                        EXPIRED & LOCKED     26-JAN-17
96 MDDATA                         EXPIRED & LOCKED     26-JAN-17
98 SPATIAL_CSW_ADMIN_USR          EXPIRED & LOCKED     26-JAN-17
1279990 DVSYS                          EXPIRED & LOCKED     26-JAN-17
101 LBACSYS                        EXPIRED & LOCKED     26-JAN-17

USER_ID USERNAME                       ACCOUNT_STATUS       CREATED
---------- ------------------------------ -------------------- ---------
103 DVF                            EXPIRED & LOCKED     26-JAN-17

34 rows selected.

SQL>

Legal, agora veja o plano de acesso:

SQL> explain plan for
select user_id, username, account_status, created from table_sem_particao partition (par_2017_p02);  

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 1050165695

-------------------------------------------------------------------------------------------------------------
| Id  | Operation              | Name               | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |                    |    34 |  3604 |     3   (0)| 00:00:01 |       |       |
|   1 |  PARTITION RANGE SINGLE|                    |    34 |  3604 |     3   (0)| 00:00:01 |     2 |     2 |
|   2 |   TABLE ACCESS FULL    | TABLE_SEM_PARTICAO |    34 |  3604 |     3   (0)| 00:00:01 |     2 |     2 |
-------------------------------------------------------------------------------------------------------------

Note

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----
- dynamic statistics used: dynamic sampling (level=2)

13 rows selected.

SQL>

Maiores informações:

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/vldbg/evolve-nopartition-table.html#GUID-5FDB7D59-DD05-40E4-8AB4-AF82EA0D0FE5


Ronaldo.

Nenhum comentário:

Postar um comentário