lunes, 20 de febrero de 2017

Cuántas particiones puede tener una tabla en Oracle Database 12c ? @OracleDatabase Español inspirado en @connor_mc_d


Inspirado en la publicación de @connor_mc_d estoy publicando la versión al español, de la pregunta:

Cuántas particiones máximo puede tener una tabla en una base de datos Oracle.?

Veamos esto con un ejemplo.
Vamos a levantar los servicios de mi VM de pruebas utilizando Oracle Linux y Oracle Database 12c R1 12.1.0.2
Mi laboratorio es un Contanier Database 12c con una base de datos PDB y el opcional de IN-MEMORY Database configurado.

[oracle@lab2-db ~]$ sqlplus /nolog

SQL*Plus: Release 12.1.0.2.0 Production on Sat Feb 18 13:43:29 2017

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

SQL> connect / as sysdba
Connected to an idle instance.

SQL> startup
ORACLE instance started.

Total System Global Area 1660944384 bytes
Fixed Size                  2925072 bytes
Variable Size             973082096 bytes
Database Buffers          452984832 bytes
Redo Buffers               13848576 bytes
In-Memory Area            218103808 bytes
Database mounted.
Database opened.

SQL> connect / as sysdba
Connected.

SQL> alter pluggable database pdb1 open;

Pluggable database altered.

Vamos a conectarnos a la base de datos, utilizando un usuario común y silvestre. Para ello, nos conectamos con el esquema de recursos humanos de demo de la base de datos.

SQL> connect hr/hr@pdb1
Connected.

Vamos a crear una tabla simple con dos columnas, particionada por rango de años.

SQL> create table SALES
( cal_year  date,
txn_id    int )
partition by range ( cal_year )
INTERVAL( NUMTOYMINTERVAL(1,'YEAR'))
(
partition p_low values less than ( date '2000-01-01' )
)
/

Table created.

Ahora sí, veamos cuantas particiones han sido creadas con la sentencia anterior.

SQL> select PARTITION_NAME, HIGH_VALUE
from   user_tab_partitions
where  table_name = 'SALES';

PARTITION_NAME                 HIGH_VALUE
------------------------------ --------------------------------------------------------------------------------
P_LOW                          TO_DATE(' 2000-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA

SQL> SELECT * FROM SALES;

no rows selected

En el plan de ejecución de la sentencia, podemos observar las columnas PSTART y PSTOP.

La columna PSTART contiene el número de la primera partición a la que se accede y la columna PSTOP contiene el número de la última partición a la que se accede.

Execution Plan
----------------------------------------------------------
Plan hash value: 1550251865

---------------------------------------------------------------------------------------------
| Id  | Operation           | Name  | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |       |     1 |    22 |     2   (0)| 00:00:01 |       |       |
|   1 |  PARTITION RANGE ALL|       |     1 |    22 |     2   (0)| 00:00:01 |     1 |1048575|
|   2 |   TABLE ACCESS FULL | SALES |     1 |    22 |     2   (0)| 00:00:01 |     1 |1048575|
---------------------------------------------------------------------------------------------

Como se puede mirar, según el plan de ejecución obtenida para el barrido completo de la tabla "sales", a la hora de hacer recorrido por la tabla, se obtiene que la partición 1 es la primera que sería barrida y que la última sería la 1.048.575.

El objeto del diccionario de la base de datos "USER_PART_INDEXES", muestra la información de partición a nivel de objeto para todos los índices particionados en la base de datos. Al consultar el valor para la columna "PARTITION_COUNT" obtenemos el resultado de 1.048.575.

SQL> select TABLE_NAME,INDEX_NAME,PARTITION_COUNT from user_part_indexes
where table_name='SALES';

SQL> column INDEX_NAME format a20;
SQL> /

TABLE_NAME           INDEX_NAME           PARTITION_COUNT
-------------------- -------------------- ---------------
SALES                SALES_IX                     1048575


Conclusión:

En Oracle Database 12c Release 1, la cantidad máxima de particiones que podemos tener en una tabla es de más de 1 Millón.

3 comentarios:

  1. Excelente respuesta, sería bueno hacer el ejercicio de subparticiones

    ResponderEliminar
  2. Muchas gracias Willblog, lo vamos a hacer más adelante. Te agradezco el comentario.

    ResponderEliminar

Te agradezco tus comentarios. Te esperamos de vuelta.