Personalmente creo que lo más importante cuando se quiere demostrar un comportamiento en Oracle, o bien generar un caso de prueba se necesita crear un escenario. Desafortunadamente para muchos ambientes ésto es muy dificil de lograr, ya sea por la seguridad de los datos en un ambiente productivo o bien por su volatilidad. Formalmente es imposible que un ambiente de pruebas, desarrollo o entrenamiento sea idéntico a un ambiente productivo, hay varias razones pero creo que las más comunes son
-el ambiente clonado no puede tener la misma distribución física de los datos (método generación del clon),
-el ambiente clonado no tiene la misma distribución en los medios de almacenamiento (los rowids son distintos),
-política de seguridad en el clon (métodos como data masking),
-el ambiente clonado es un instante en el tiempo del ambiente de producción tal que existe una varianza en los datos / distribución mayor al 0.01%,
-no se requiere mantener igualdad entre los ambientes,
-la actividad en los ambientes es por pura definición diferente, un ambiente de QA (aún con robots de prueba) tendrá difícilmente una carga idéntica a la del ambiente productivo que además tendrá actividad que no generará LCR,
Lo más importante para generar un ambiente de prueba es comprender el modelo del proceso de negocio, con mucha frecuencia cuando hay que hacer demostraciones genero un ambiente personalizado que modela la distribución productiva de los datos pero sin contener los mismos datos.
En este post quiero documentar un caso genérico de generación de casos de prueba, genero una tabla de 35MB en únicamente tres sentencias, es muy importante que la versión de la base de datos sea la misma a la versión del ambiente productivo. Por supuesto lo importante es modelar el proceso de negocio, en mi caso la tabla tiene 5 columnas
Name Null? Type
----------------------------------------------------------- -------- ----------------------------------------
UNIQUEID NOT NULL NUMBER
ID NUMBER
ID2 NUMBER
TDATE NOT NULL DATE
OBJECT_NAME NOT NULL VARCHAR2(30)
SUBOBJECT_NAME VARCHAR2(30)
Para la creación de la tabla y la inserción de valores usamos una materialización con base en una tabla con una gran cardinalidad, en este caso uso all_objects.
create table large
as
with generator as
(select --+materialize
rownum id,
rownum / 500000 id2,
created tdate,
object_name object_name,
subobject_name subobject_name
from all_objects
where rownum < 500000)
select
rownum uniqueid,
a.*
from generator a,
generator b
where rownum < 500000;
Después creo una llave primaria
alter table large add primary key (uniqueid);
Finalmente inserto muchos valores
insert into large (select uniqueid+499999, id, id2, tdate, object_name, subobject_name from large);
De este modo tengo una tabla con una distribución de datos similar al modelo productivo, que puedo recrear cuantas veces quiera y con la que puedo documentar las pruebas.