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