Oracle Database 12c: "Nuevas Características para Desarrolladores" (Parte III)

Por Joel Pérez & Mahir M. Quluzade (OCP) Publicado en Octubre 2014

Reciban estimados tecnólogos Oracle un cordial saludo. A través del presente artículo, tendremos la oportunidad de visualizar y adentrarnos un poco en algunas de las nuevas características que trajo consigo la nueva versión de base de datos ( BBDD ) “Oracle Database 12c”.

Iniciemos con esta última entrega sobre las Nuevas Características para Desarrolladores de Oracle Database 12c...

“Movimiento de Particiones ’Online’ & “Nuevos tipos de compresiones para tablas”

Previo a “Oracle Database 12c” el tema relacionado con la reorganización de tablas, particiones y sub-particiones era un área que requería previsiones, planificaciones y puestas en marchas de estrategias para evitar altas contenciones a causa de operaciones “DML” paralelas a la reorganización.

A partir de “Oracle Database 12c” la reorganización de tablas, particiones y sub-particiones paso a convertirse en una operación menos elaborada en su planificación al poder contar con la clausula “ONLINE” la cual permite operaciones “DML” sin interrupción. Esta nueva funcionalidad puede ser utilizada para:

  • Mover particiones y sub-particiones de un “storage” a otro. De “Filesystems” a “+ASM” & viceversa, de “storages” rápidos a lentos, entre “filesystems” pertenecientes a “SANs” distintas, en si, entre cualquier linea de “storage” disponible para almacenamiento habilitada para la BBDD.
  • Mover particiones y sub-particiones a “storage” de bajo costo una vez que estas se han tornado en particiones no accedidas con alta frecuencia, dichos cambios se pudiesen llevar a cabo “On Demand” o producto de la evaluación y acción de políticas “ADO” ( Automatic Data Optimization ). “ADO” representa un mecanismo de ejecución para mover o comprimir tablas, particiones y sub-particiones de acuerdo a políticas construidas bajo este mecanismo. Las políticas de “ADO” están basadas en análisis de estadísticas de uso de objetos a través del mecanismo de “Heat Map”.
  • Comprimir particiones y sub-particiones de acuerdo a políticas “ADO”

Beneficios:

  • “DML” permitidos en vivo
  • Realización de “Move”,”Split” o “Merge” “ONLINE” de particiones y sub-particiones a determinados “tablespaces”
  • Durante la ejecución los índices Globales y Locales son mantenidos de forma automática, los tradicionales “Index Rebuild” manuales ya no son requeridos.

SQL> ALTER TABLE ORDERS
2 MOVE PARTITION ORD_P1
3 TABLESPACE lowtbs
4 UPDATE INDEXES ONLINE;

Tipos de Compresiones de Tablas en “Oracle Database 12c”

La Clausula “MOVE” es el vehículo típico para comprimir segmentos. Los tipos soportados se clasifican en modo macro en:

  • BASIC
  • OLTP
  • HCC ( “Hybrid Columnar Compression” )
  • ROW STORE COMPRESS BASIC/ADVANCED: se utiliza para las filas insertadas sin el uso de “direct-path insert” utilizando la opción “Advanced Compression Option (ACO)” . ROW STORE COMPRESS ADVANCED es la nueva sintaxis utilizada con la función "Advanced Row Compresión" , este es el nuevo nombre para el antiguo “OLTP Table compression feature” parte de “ACO”.
  • COLUMN STORE COMPRESS FOR QUERY LOW/HIGH: provee un nivel mas alto de compresión respecto a “ROW STORE COMPRESS”. Trabaja de forma excelente con cargas de trabajos criticas, frecuentes consultas y un grado de operaciones no tan altas como para las que esta diseñada “ROW STORE COMPRESS” .
  • COLUMN STORE COMPRESS FOR ARCHIVE LOW/ARCHIVE HIGH: posee el nivel mas alto de compresión y esta adecuado para el acceso de data infrecuente, para esta configuración el perfil adecuado esta basado en que la data permanezca mayormente en modo “read only”.



ROW STORE COMPRESS [BASIC]

SQL> ALTER TABLE ORDERS MOVE PARTITION ORD_P1
2        ROW STORE COMPRESS
3 UPDATE INDEXES ONLINE;

ROW STORE COMPRESS ADVANCED
SQL> ALTER TABLE ORDERS MOVE PARTITION ORD_P1
2        ROW STORE COMPRESS ADVANCED
3        UPDATE INDEXES ONLINE;

SQL> ALTER TABLE sales MOVE PARTITION sales_2000
2 COMPRESS FOR OLTP
3        UPDATE INDEXES ONLINE;

COLUMN STORE COMPRESS
SQL> ALTER TABLE ORDERS MOVE PARTITION ORD_P1
2 COLUMN STORE COMPRESS FOR QUERY HIGH
3        UPDATE INDEXES ONLINE;

COLUMN STORE COMPRESS
SQL> ALTER TABLE ORDERS MOVE PARTITION ORD_P1
2        COLUMN STORE COMPRESS FOR ARCHIVE HIGH
3        UPDATE INDEXES ONLINE;

“Otorgado de Roles a` ‘Program Units’”

Previo a “Oracle Database 12c” siempre hemos manejado el mecanismo basado en que los roles solo podían ser otorgados a usuarios o roles como tal. Y dicho modo de aplicar seguridad ha funcionado sin mayor dificultad, sin embargo pudiesen haber casos muy particulares donde el dinamismo del código requiera un algo mas de esta area.

Ej. Supongamos, que poseemos un ejemplo de un “Stored Procedure” ”SP” el cual posee código dinámico y dentro de ese código dinámico se establece en un determinado momento la creación de una tabla. Si el usuario que esta invocando el “Program Unit” recibirá un mensaje de error a pesar de que pueda poseer permiso de ejecución sobre el “SP”. Para tal caso, el código tuviese que adaptarse en tiempo real para dar permiso temporal al usuario que ejecuta el “SP”, para ello el administrador de BBDDs debiese otorgar el privilegio al usuario en tiempo de ejecución y removerlo pero quizás podríamos conseguir otra dificultad.. los usuarios DBAs por “Best Practice” no están incluidos en la ejecución de código de aplicación. Siendo asi el DBA tendría que otorgar el privilegio a ser dado a un usuario intermedio que funja como “Mini-DBA” intermedio para llevar a cabo la sentencia de otorgar privilegio. Esta podría ser una via, quizás otra podría ser que se de permiso a los usuarios ejecutores de todas las posibles acciones que se puedan realizar en el código dinámico.. en dicho caso estaríamos fluyendo en una dirección contraria al principio de seguridad “Least Privilege”, entonces.. para todo este cuadro que acabos de dibujar, existe una solución en 12c. Esta se basa en la posibilidad de otorgar privilegios directamente a un “Program Unit” de manera que el privilegio este contenido en el mismo y no en los usuarios.




SQL> create user usr identified by usr
2  default tablespace users
3  quota unlimited on users;
User created.

SQL> create role create_table_role;
Role created.

SQL> grant create table to create_table_role;
Grant succeeded.

SQL> grant create session, create procedure to usr;
Grant succeeded.

SQL> grant create_table_role to usr with admin option;
Grant succeeded.

SQL> alter user a default role all except create_table_role;
User altered.

SQL> connect usr/usr
Connected.

SQL> create or replace procedure proc1
2  as
3  begin
4          execute immediate
5          'create table tb1 ( col1 int )';
6  end;
7  /

Procedure created.

SQL> exec proc1;

BEGIN proc1; END;

*
ERROR at line 1:
ORA-01031: insufficient privileges
ORA-06512: at "USR.PROC1", line 4
ORA-06512: at line 1

SQL> set role create_table_role;
Role set.

SQL> grant create_table_role to procedure proc1;
Grant succeeded.

SQL> exec proc1;

PL/SQL procedure successfully completed.
SQL> set linesize 35
SQL> desc tb1

Name              Null?    Type
--------------- ------- ------------
COL1                         NUMBER(38

“Mejorado en Clausula ’WITH’”

La clausula “WITH” representa un nuevo mecanismo para realizar la declaración de funciones y “Stored Procedures” PL/SQL para poder ser utilizadas dentro de un mismo bloque PL/SQL. La filosofía de este nuevo concepto es muy parecida a lo que representa un bloque dinamico PL/SQL, con la diferencia de que este puede definir “SP” & funciones y utilizarlos en consultas al final de estos. Ventajas:

  • No permanece como objeto PL/SQL almacenado en la BBDD
  • Posee un tiempo de ejecución mucho menor con respecto al modelo de “Program Units” guardados en la BBDD

Veamos algunos ejemplos:



SQL>set serveroutput on
SQL>
SQL>with
2 procedure shownum (n in number) is
3 begin
4  dbms_output.put_line(' number n: ' || n);
5 end;
6
7 function funcnum(n in number) return number is
8 begin
9   shownum(n);
10  return n;
11 end;
12 select funcnum(1) as num from dual;
NUM
---------
1

Number n: 1

PL/SQL

SQL> set serveroutput on
SQL>
SQL>declare
2  v_sql     varchar2(32767);
3  v_cursor  sys_refcursor;
4  v_val   number;
5 begin
6  v_sql := 'WITH
7            FUNCTION funcMult10(n IN NUMBER)
8              RETURN NUMBER IS
9            BEGIN
10              RETURN n*10;
11            END;
12          SELECT funcMult10(100) as Mult10 FROM dual;';
13
14  open v_cursor for v_sql;
15  fetch v_cursor into v_val;
16  dbms_output.put_line('Number 100 multiplied to 10: ' || v_val);
17  close v_cursor;
18 end;
/
Number 100 multiplied to 10: 1000
PL/SQL procedure successfully completed

Esperando una vez más que este material sea de provecho significativo para ustedes como lector, nos despedimos hasta la próxima.

Saludos

Joel es un experto DBA con más de 12 años de experiencia, especializado en bases de datos con especial énfasis en la soluciones de alta disponibilidad (RAC, Data Guard, y otras). Es un conferencista habitual en eventos de Oracle como: OTN LAD TOUR y otros. Consultor Internacional con trabajos en más de 20 países alrededor del mundo. Fue el primer latinoamericano en ser nombrado "Experto OTN" en el año 2003, Oracle ACE año 2004 y actualmente Oracle ACE Director.

Mahir es un Senior DBA con mas de 10 anos de experiencia en bases de datos Oracle con especial foco en "High Availability" & "Disaster Recovery Solutions (RAC, Data Guard, RMAN,…)". Mahir actualmente trabaja en el "Central Bank of the Republic of Azerbaijan". El es OCP DBA. Mahir es frecuente orador en el "Azerbaijan Oracle User Group (AZEROUG)".