jueves, 21 de marzo de 2013

Soluciones de Base de Datos en las Nube!!

Base de datos en la nube

DANAConnect provee una versátil herramienta de base de datos que opera completamente en la nube, capaz de manejar millones de registros, realizar segmentaciones automáticas y proveer diferentes vistas y reportes sobre los datos de acuerdo a distintos parámetros de análisis.
La información cargada reside de forma segura en nuestros servidores de datos de alta disponibilidad y puede ser accedida simplemente a través de un navegador de internet tal como Firefox, Chrome e Internet Explorer. La aplicación cuenta con una interfaz sencilla que en pocos pasos permite la definición de una estructura de datos compleja, la carga masiva de datos y la generación de segmentos y reportes de gran utilidad.

Manejo de Listas

Las bases de datos de DANAConnect son el punto de partida de todas las aplicaciones de DANA, en tanto permiten la carga masiva y almacenamiento seguro de la información de los clientes y sus interacciones que será utilizada para la ejecución de campañas comunicacionales.
Imagen_1_copy
Las bases de datos son una representación lógica de cualquier tipo de información de negocio relevante que se desee almacenar. Esta información puede consistir en listas de clientes, productos, categorías, consumos, subscripciones, pagos, etc. La información puede organizarse en diferentes bases de datos, tantas como sea requerido, y cada base de datos admite tantos campos como sea necesario.

Imagen_2
Cada campo de la base de datos puede ser de un tipo específico, tal como “numérico”, “alfanumérico”, “fecha”, etc. o puede ser de un tipo configurable avanzado tal como “correo electrónico”, “dirección”, o “archivo”.
Los tipos de datos permiten definir reglas y validaciones sobre los campos ingresados desde la interfaz web, minimizando así errores durante la carga de datos. Adicionalmente, el sistema admite que una base de datos sea utilizada como un tipo de campo, de forma que los valores que dicho campo pueda tomar esté restringido por los valores incluidos en esa base de datos.
Estas campos de tipo “relación” son extremadamente útiles para la definición de categorías y otros valores de tipificación.
De este modo, es posible definir en apenas minutos una estructura compleja de bases de datos, organizada de acuerdo a un modelo flexible que puede ser modificado en cualquier momento.

Segmentación Avanzada

La segmentación avanzada de datos es una de las principales funcionalidades de nuestra plataforma.
Los segmentos son subconjuntos de datos que ofrecen información agregada para usos gerenciales y de toma de decisiones y, por lo general, se definen para usos de negocio específicos, tal como el listado de los últimos clientes registrados en el sistema, o el listado de los productos más vendidos en el último trimestre.
Un segmento se construye aplicando filtros sobre la información. Por ejemplo, un segmento puede definirse a partir de condiciones tales como “fecha de nacimiento mayor que hoy”, “nombre contiene letra m”, “email de contacto no es vacío”.

Imagen_3
Las condiciones de filtro siempre deben operar sobre un campo clave de la base de datos, lo cual implica que debe prestarse atención a la calidad de la información contenida en el mismo.
Si un campo utilizado para un filtro se define como opcional o no se le realizan validaciones durante la carga de datos, es posible que la información representada por la vista no tenga completa validez.
Tanto las bases de datos como cualquiera de sus segmentos pueden ser utilizados como punto de partida para la ejecución de una campaña comunicacional. Incluso, la plataforma DANAConnect permite a la ejecución de campañas de segmentación automática, apalancando el nodo de marcado, las cuales realizan el proceso de creación de segmentos de forma automatizada.
Imagen_4
Las condiciones de filtro siempre deben operar sobre un campo clave de la base de datos, lo cual implica que debe prestarse atención a la calidad de la información contenida en el mismo. Si un campo utilizado para un filtro se define como opcional o no se le realizan validaciones durante la carga de datos, es posible que la información representada por la vista no tenga completa validez.
Tanto las bases de datos como cualquiera de sus segmentos pueden ser utilizados como punto de partida para la ejecución de una campaña comunicacional. Incluso, la plataforma DANAConnect permite a la ejecución de campañas de segmentación automática, apalancando el nodo de marcado, las cuales realizan el proceso de creación de segmentos de forma automatizada.
Por ejemplo, sobre la base de una lista de contactos de potenciales clientes, se puede ejecutar una campaña de promoción enviando un correo electrónico con imágenes de distintos productos y enlaces a páginas de destino con mayor información sobre cada uno.
Esta campaña puede detectar automáticamente aquellos clientes que han mostrado interés en un producto en particular y “marcarlos” como clientes de mayor valor.
Este marcado genera una marca en la base de datos que puede usarse como filtro para un segmento avanzado, de forma que la vista de “Clientes Interesados” se alimente automáticamente con base en las interacciones ocurridas en la campaña. Este nuevo segmento puede ser utilizado como base para una nueva campaña más focalizada en el producto específico seleccionado por el cliente.

Reportes

La herramienta de base de datos permite la búsqueda avanzada y la generación de reportes con base en distintas condiciones sobre los datos existentes. El resultado de una búsqueda o un reporte puede exportarse a un archivo en formato CSV (separado por comas) para la consulta desde sistemas externos, o bien puede ser utilizado para la generación de un nuevo segmento de datos.
Imagen_5

Importación/Exportación

La herramienta de bases de datos facilita la carga y descarga de información a través de archivos en formato CSV (separado por comas), a fin de ser utilizados por sistemas externos a la plataforma DANAConnect. El proceso de carga de información en las bases de datos de DANA incluye funcionalidades avanzadas para detectar la existencias de registros duplicados.
Imagen_6





Database.com es un servicio con el que vamos a poder crear tablas, campos y relacionarlos entre si, no solo desde la consola sino que de forma totalmente gráfica mediante la herramienta diseñada especialmente para ello. La plataforma esta pensada para que sea utilizada por programadores de diversos lenguajes como pueden ser: Java, C#, Ruby y como es de esperarse también PHP.

Lo interesante de esta herramienta es que esta pensada para ser utilizada como motor de base de datos de aplicaciones móviles, razón que la convierte en un buen aliado de programadores de aplicaciones para iPhone, iPad, Blackberry y Android. Para esto nos brinda mediante su API acceso seguro por medio de los estándares más difundidos: REST, SOAP, oAuth y SAML.

El precio de tener tu base de datos en la nube. Gratuito hasta 100.000 registros, 50.000 transacciones por mes y 3 usuarios. Luego en caso de ir incrementando nuestras necesidades recién ahí tendremos que abonar 10 dólares por mes por cada 100.000 registros adicionales y 10 dólares por mes por cada 150.000 transacciones extras.


En VirtualNova.com encuentra desde una página Web de calidad, hasta sistemas complejos con manejo sofisticado de bases de datos funcionando en estructura de nube (cloud computing), a precios accesibles y con la capacidad de crecer a medida que crezcan sus necesidades, reduciendo así los costos de crecimiento de sus servicios en Web.
Soluciones completas a sus necesidades de servicios en Internet, de esta forma no tiene que tratar con varios proveedores para poder tener su servicio en Internet, VirtualNova.com le ofrece la mejor calidad y el mejor servicio disponibles en el mercado.

miércoles, 20 de marzo de 2013

actividad 20

Actividad 18 y 19

Microsoft Windows [Versión 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Reservados todos los derechos.
C:\Users\prueba>cd..
C:\Users>cd..
C:\>cd xampp
C:\xampp>cd mysql
C:\xampp\mysql>cd bin
C:\xampp\mysql\bin>mysql -hlocalhost -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.41 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use veterinaria
No connection. Trying to reconnect...
Connection id:    1
Current database: *** NONE ***
Database changed
mysql> show tables
    -> ;
+-----------------------+
| Tables_in_veterinaria |
+-----------------------+
| caracteristicas       |
| mascota               |
| propietario           |
+-----------------------+
3 rows in set (0.00 sec)
mysql> select from*caracteristicas;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'from*
caracteristicas' at line 1
mysql> select fromcaracteristicas;
ERROR 1054 (42S22): Unknown column 'fromcaracteristicas' in 'field list'
mysql> select* from caracteristicas;
+-----------+------------+----------+------------+---------------+----------+---
---------+------+
| Condicion | Pelaje     | Tatuajes | Cicatrices | FinZootecnico | Cirujias | Co
lor      | id_M |
+-----------+------------+----------+------------+---------------+----------+---
---------+------+
| estable   | sedoso     | no       | no         | mascota       | no       | ca
fe       | NULL |
| Regular   | maltratado | no       | si         | mascota       | no       | bl
anco     | NULL |
| buena     | grasoso    | si       | no         | trabajo       | si       | ne
gro      | NULL |
| mala      | sedoso     | si       | si         | trabajo       | no       | gr
is       | NULL |
| Regular   | maltratado | no       | no         | mascota       | si       | ca
fe claro | NULL |
+-----------+------------+----------+------------+---------------+----------+---
---------+------+
5 rows in set (0.00 sec)
mysql> select* from mascota;
+------+-----------+--------+--------------------+-----------+--------+---------
--+----------+
| id_M | Nombre_M  | Sexo_M | FechaNacimientos_M | Especie_M | peso_M | Raza_M
  | Alzada_M |
+------+-----------+--------+--------------------+-----------+--------+---------
--+----------+
| 0001 | Cosita    | f      | 2010-02-28         | Mamifero  | 4      | pudul
  | 10 mts   |
| 0002 | Shastar   | M      | 2010-05-20         | Mamifero  | 4      | Husky
  | 3 mts    |
| 0003 | Roky      | M      | 2011-04-21         | Mamifero  | 3      | Boxer
  | 7 mts    |
| 0004 | Scam      | M      | 2001-07-11         | Reptil    | 1      | Serpient
e | 7 mts    |
| 0005 | Saltadora | F      | 2013-01-17         | Anfibios  | 2      | Rana
  | 1 mts    |
+------+-----------+--------+--------------------+-----------+--------+---------
--+----------+
5 rows in set (0.00 sec)
mysql> select* from propietario;
+------+-----------+---------------+-------------+------------+------+
| id_p | Nombre_p  | Prof_Oficio_p | Direccion_p | telefono_p | id_M |
+------+-----------+---------------+-------------+------------+------+
| 1000 | Ruben     | Empleado      | 0000-00-00  | 6563739115 | NULL |
| 1001 | Alejandra | Hogar         | 0000-00-00  | 6562815698 | NULL |
| 1002 | Angel     | Maestro       | 0000-00-00  | 6562963587 | NULL |
| 1003 | Angelica  | Maestra       | 0000-00-00  | 6563659874 | NULL |
+------+-----------+---------------+-------------+------------+------+
4 rows in set (0.00 sec)
mysql> insert into propietario values ('1004','Alfredo','Maestro','0','614405395
4','1');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into propietario values ('1004','Uziel','Deportista','1','65640539
54','2');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into propietario values ('1004','Denisse','Masajista','2','6562669
265','3');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select* from propietario;
+------+-----------+---------------+-------------+------------+------+
| id_p | Nombre_p  | Prof_Oficio_p | Direccion_p | telefono_p | id_M |
+------+-----------+---------------+-------------+------------+------+
| 1000 | Ruben     | Empleado      | 0000-00-00  | 6563739115 | NULL |
| 1001 | Alejandra | Hogar         | 0000-00-00  | 6562815698 | NULL |
| 1002 | Angel     | Maestro       | 0000-00-00  | 6562963587 | NULL |
| 1003 | Angelica  | Maestra       | 0000-00-00  | 6563659874 | NULL |
| 1004 | Alfredo   | Maestro       | 0000-00-00  | 6144053954 | 1    |
| 1004 | Uziel     | Deportista    | 0000-00-00  | 6564053954 | 2    |
| 1004 | Denisse   | Masajista     | 0000-00-00  | 6562669265 | 3    |
+------+-----------+---------------+-------------+------------+------+
7 rows in set (0.00 sec)
mysql> select* from mascota;
+------+-----------+--------+--------------------+-----------+--------+---------
--+----------+
| id_M | Nombre_M  | Sexo_M | FechaNacimientos_M | Especie_M | peso_M | Raza_M
  | Alzada_M |
+------+-----------+--------+--------------------+-----------+--------+---------
--+----------+
| 0001 | Cosita    | f      | 2010-02-28         | Mamifero  | 4      | pudul
  | 10 mts   |
| 0002 | Shastar   | M      | 2010-05-20         | Mamifero  | 4      | Husky
  | 3 mts    |
| 0003 | Roky      | M      | 2011-04-21         | Mamifero  | 3      | Boxer
  | 7 mts    |
| 0004 | Scam      | M      | 2001-07-11         | Reptil    | 1      | Serpient
e | 7 mts    |
| 0005 | Saltadora | F      | 2013-01-17         | Anfibios  | 2      | Rana
  | 1 mts    |
+------+-----------+--------+--------------------+-----------+--------+---------
--+----------+
5 rows in set (0.00 sec)
mysql> insert into mascota values ('0006','','Masajista','2','6562669265','3');
ERROR 1136 (21S01): Column count doesn't match value count at row 1
mysql> insert into mascota values ('0006','Peny','M','2013-02-28','Mamifero','3'
,'Beagle','1');
Query OK, 1 row affected (0.00 sec)
mysql> insert into mascota values ('0007','Muñeca','F','2011-05-25','Mamifero','
1','boxer','3');
Query OK, 1 row affected (0.00 sec)
mysql> decribe mascota;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'decri
be mascota' at line 1
mysql> select* from mascota;
+------+-----------+--------+--------------------+-----------+--------+---------
--+----------+
| id_M | Nombre_M  | Sexo_M | FechaNacimientos_M | Especie_M | peso_M | Raza_M
  | Alzada_M |
+------+-----------+--------+--------------------+-----------+--------+---------
--+----------+
| 0001 | Cosita    | f      | 2010-02-28         | Mamifero  | 4      | pudul
  | 10 mts   |
| 0002 | Shastar   | M      | 2010-05-20         | Mamifero  | 4      | Husky
  | 3 mts    |
| 0003 | Roky      | M      | 2011-04-21         | Mamifero  | 3      | Boxer
  | 7 mts    |
| 0004 | Scam      | M      | 2001-07-11         | Reptil    | 1      | Serpient
e | 7 mts    |
| 0005 | Saltadora | F      | 2013-01-17         | Anfibios  | 2      | Rana
  | 1 mts    |
| 0006 | Peny      | M      | 2013-02-28         | Mamifero  | 3      | Beagle
  | 1        |
| 0007 | Muñeca    | F      | 2011-05-25         | Mamifero  | 1      | boxer
  | 3        |
+------+-----------+--------+--------------------+-----------+--------+---------
--+----------+
7 rows in set (0.00 sec)
mysql> create table Consulta (num_consulta, motivo);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near ' moti
vo)' at line 1
mysql> create table Consulta (num_consulta, motivo);

Actividad 17


martes, 12 de marzo de 2013

Administración de un DBMS real

MySQL.- es una manejador de bases de datos relacional bastante robusto, de código abierto bajo la licencia GPL el cual se ha convertido en el más popular hoy en día. Su origen se debió a la búsqueda por parte de los fundadores de crear un manejador de bases de datos que fuera "rápido", todavía más rapido que mSQL. Así surgió MySQL, primero como un producto de la empresa y despúes como software de dominio público. El nombre de My se debe probablemente a que la hija del cofundador Monty Widenius recibía ese sobrenombre, aunque a ciencia cierta nunca se ha revelado el origen.

Por qué usar MySQL ?.- Es importante resaltar que no se trata de una herramienta de juguete o aprendizaje, MySQL es un manejador que puede competir competir con sus famosas contrapartes comerciales: Oracle, DB2, Informix, Sybase.  los motivos por los cuales se podría optar por usar MySQL son: Es gratis, Es extensible, Es robustom, Es rápido, No requiere de una gran número de recursos para funcionar (obviamente para aplicaciones a gran escala es mejor contar con una buena infraestructura), Es fácil de administrar.

 Instalación Básica.- Una vez descargado el software se procede a desempaquetarlo (.tgz, zip) o bien ejecutar el .exe correspondiente.

Dichos directorios contenidos en un directorio que por lo general lleva el mismo nombre 'mysql' contiene una estructura de la siguiente manera:

  • bin: programas ejecutables, mysql, mysqld, mysqldump, myisamchk, mysqlbinlog.
  • include, lib, libexec: librerías y encabezados para programar en C/C++
  • mysql-test, sql-bench: pruebas y benchmarks
  • var ó data: estructura de todas las bases y datos de las tablas tipo MyISAM y Berkeley DB.
  • man: páginas de manual
  • share: información en distintos idiomas
  • support-files: archivos de configuración y scripts de arranque automático

Antes de poder ejecutar el demonio (o guardián) del manejador, es conveniente realizar una configuración, para ello se tiene que editar alguno de los archivos .cnf, los cuales se encuentran ubicados en el directorio raíz de mysql o bien en el directorio support-files. El archivo elegido dependera de la configuración de la máquina (small, medium, large, huge), cada archivo provee información acerca de la memoria apropiada para cada configuración. La tabla 3.2 muestra un ejemplo de configuración para una arquitectura media.

Tipos de datos y sus valores en byte

Nombre
¿Admite decimales?
Valor mín.
Valor máx.
Precisión
Ocupa
byte
no
-128
127
-
1 byte
short
no
-32.768
32.767
-
2 bytes
int
no
-2.147.483.648
2.147.483.647
-
4 bytes
long
no
-9.223.372.036.854.775.808
9..223.372.036.854.775.807
-
8 bytes
float
1.401298E-45
3.402823E38
6-7 cifras
4 bytes
double
4.94065645841247E-324
1.79769313486232E308
14-15 cifras
8 bytes

La forma de "declarar" variables de estos tipos es la siguiente:

int numeroEntero; // La variable numeroEntero será un número de tipo "int"
short distancia; // La variable distancia guardará números "short"
long gastos; // La variable gastos es de tipo "long"
byte edad; // Un entero de valores "pequeños"
float porcentaje; // Con decimales, unas 6 cifras de precisión
double numPrecision; // Con decimales y precisión de unas 14 cifras

Tipo de dato Sinónimos Tamaño Descripción
BINARY VARBINARY
BINARY VARYING
BIT VARYING
1 byte por carácter Se puede almacenar cualquier tipo de datos en un campo de este tipo. Los datos no se traducen (por ejemplo, a texto). La forma en que se introducen los datos en un campo binario indica cómo aparecerán al mostrarlos.
BIT BOOLEAN
LOGICAL
LOGICAL1
YESNO
1 byte Valores Sí y No, y campos que contienen solamente uno de dos valores.
TINYINT INTEGER1
BYTE
1 byte Un número entero entre 0 y 255.
COUNTER AUTOINCREMENT
Se utiliza para campos contadores cuyo valor se incrementa automáticamente al crear un nuevo registro.
MONEY CURRENCY 8 bytes Un número entero comprendido entre
– 922.337.203.685.477,5808 y 922.337.203.685.477,5807.
DATETIME DATE
TIME
8 bytes Una valor de fecha u hora entre los años 100 y 9999
UNIQUEIDENTIFIER GUID 128 bits Un número de identificación único utilizado con llamadas a procedimientos remotos.
DECIMAL NUMERIC
DEC
17 bytes Un tipo de datos numérico exacto con valores comprendidos entre 1028 - 1 y - 1028 - 1. Puede definir la precisión (1 - 28) y la escala (0 - precisión definida). La precisión y la escala predeterminadas son 18 y 0, respectivamente.
REAL SINGLE
FLOAT4
IEEESINGLE
4 bytes Un valor de coma flotante de precisión simple con un intervalo comprendido entre – 3,402823E38 y – 1,401298E-45 para valores negativos, y desde 1,401298E-45 a 3,402823E38 para valores positivos, y 0.
FLOAT DOUBLE
FLOAT8
IEEEDOUBLE
NUMBER
8 bytes Un valor de coma flotante de precisión doble con un intervalo comprendido entre – 1,79769313486232E308 y – 4,94065645841247E-324 para valores negativos, y desde 4,94065645841247E-324 a 1,79769313486232E308 para valores positivos, y 0.
SMALLINT SHORT
INTEGER2
2 bytes Un entero corto entre – 32.768 y 32.767.
INTEGER LONG
INT
INTEGER4
4 bytes Un entero largo entre – 2.147.483.648 y 2.147.483.647.
IMAGE LONGBINARY
GENERAL
OLEOBJECT
Lo que se requiera Desde cero hasta un máximo de 2.14 gigabytes.
Se utiliza para objetos OLE.
TEXT LONGTEXT
LONGCHAR
MEMO
NOTE
NTEXT
2 bytes por carácter. (Consulte las notas). Desde cero hasta un máximo de 2.14 gigabytes.
CHAR TEXT(n)
ALPHANUMERIC
CHARACTER
STRING
VARCHAR
CHARACTER VARYING
NCHAR
NATIONAL CHARACTER
NATIONAL CHAR
NATIONAL CHARACTER VARYING
NATIONAL CHAR VARYING
2 bytes por carácter. (Consulte las notas). Desde cero a 255 caracteres.

lunes, 11 de marzo de 2013

Particionado en MySql y Oracle

Particionado en MySql.

 
Manual: El particionado lo podriamos realizar nosotros en nuestra lógica de procesos de carga ETL (creando tablas para separar los datos, por ejemplo, tabla de ventas por año o por mes/año). Luego nuestro sistema de Business Intelligence tendrá que ser capaz de gestionar este particionado para saber de que tabla tiene que leer según los datos que le estemos pidiendo (tendra que tener un motor de generación de querys que sea capaz de construir las sentencias para leer de las diferentes tablas que incluyen los datos). Puede resultar complejo gestionar esto.
Automatico: Las diferentes porciones de la tabla podrán ser almacenadas en diferentes ubicaciones del sistema de forma automatica según nos permita el SGBDR que estemos utilizando.La gestión del particionado es automática y totalmente transparente para el usuario, que solo ve una tabla entera (la tabla “lógica” que estaria realmente partida en varias tablas “fisicas”). La gestión la realiza de forma automática el motor de base de datos tanto a la hora de insertar registros como a la hora de leerlos.
La partición de tablas se hace normalmente por razones de mantenimiento, rendimiento o gestión.

Lógica Particionado de tablas

Según la forma de realizar el particionado, podriamos distinguir:
Partición horizontal (por fila): consiste en repartir las filas de una tabla en diferentes particiones. Por ejemplo, los clientes de un pais estan incluidos en una determinada partición y el resto de clientes en otra. En cada partición se incluyen los registros completos de cada cliente.
Partición vertical( por columna): consiste en repartir determinadas columnas de un registro en una partición y otras columnas en otra (partimos la tabla verticalmente,). Por ejemplo, en una partición tenemos las columnas de datos de direcciones de los clientes, y en otra partición las columnas de datos bancarios.
Cada motor de base de datos implementa el particionado de forma diferente. Nosotros nos vamos a centrar en la forma de implementarlo utilizando Mysql, que es la base de datos que estamos utilizando para nuestro proyecto.

Particionado de tablas en MySql

MySql implementa el particionado horizontal. Basicamente, se pueden realizar cuatro tipos de particionado, que son:
  • RANGE: la asignación de los registros de la tabla a las diferentes particiones se realiza según un rango de valores definido sobre una determinada columna de la tabla o expresión (ver manual online de MySql aquí ). Es decir, nosotros indicaremos el numero de particiones a crear, y para cada partición, el rango de valores que seran la condicion para insertar en ella, de forma que cuando un registro que se va a introducir en la base de datos tenga un valor del rango en la columna/expresion indicada, el registro se insertara en dicha partición.
  • LIST: la asignación de los registros de la tabla a las diferentes particiones se realiza según una lista de valores definida sobre una determinada columna de la tabla o expresión (ver manual online de MySql aquí ). Es decir, nosotros indicaremos el numero de particiones a crear, y para cada partición, la lista de valores que seran la condicion para insertar en ella, de forma que cuando un registro que se va a introducir en la base de datos tenga un valor incluido en la lista de valores, el registro se insertara en dicha partición.
  • HASH: este tipo de partición esta pensado para repartir de forma equitativa los registros de la tabla entre las diferentes particiones. Mientras en los dos particionados anteriores eramos nosotros los que teniamos que decidir, según los valores indicados, a que partición llevamos los registros, en la partición HASH es MySql quien hace ese trabajo. Para definir este tipo de particionado, deberemos de indicarle una columna del tipo integer o una función de usuario que devuelva un integer (ver manual online de MySql aquí ). En este caso, aplicamos una función sobre un determinado campo que devolvera un valor entero. Según el valor, MySql insertará el registro en una partición distinta.
  • KEY: similar al HASH, pero la función para el particionado la proporciona MySql automáticamente (con la función MD5) (ver manual online de MySql aquí ). Se pueden indicar los campos para el particionado, pero siempre han de ser de la clave primaria de la tabla o de un indice único.
  • SUBPARTITIONS: Mysql permite ademas realizar subparticionado. Permite la división de cada partición en multiples subparticiones. (ver manual online de MySql aquí).
Ademas, hemos de tener en cuenta que la definición de particiones no es estática. Es decir, MySql tiene herramientas para poder cambiar la configuración del particionado a posteriori, para añadir o suprimir particiones existentes, fusionar particiones en otras, dividir una particion en varias, etc. (ver aquí ).
El particionado tiene sus limitaciones y sus restricciones, pues no se puede realizar sobre cualquier tipo de columna o expresión (ver restricciones al particionado aquí), tenemos un limite de particiones a definir y habrá que tener en cuenta algunas cosas para mejorar el rendimiento de las consultas y evitar que estas se recorran todas las particiones de una tabla (ver el artículo MySql Partitions in Practice, donde se nos explica con un ejemplo trabajando sobre una base de datos muy grande, como realizar particionado y que cosas tener en cuenta para optimizar los accesos a las consultas). Para entender como funciona el particionado, hemos replicado los ejemplos definidos en este articulo con una tabla de pruebas de 1 millón de registros (llenada, por cierto,con datos de prueba generados con Talend y el componente tRowGenerator).
Ejemplo componente tRowGenerator para producir datos de test
En concreto, hemos creado dos tablas iguales (con la misma estructura). Una con particionado por año en un campo de la clave del tipo fecha, y la segunda con la misma estructura sin particionado. En ambas tablas tenemos un millon de registros repartidos entre los años 2008 y 2017. Una vez creadas las tablas, utilizamos la sentencia de MySql explain y explain partitions para analizar como se ejecutaran las sentencias sql (analisis de indices). Ademas, comprobamos tiempos de ejecución con diferentes tipos de sentencia SQL. Los resultados son mas que obvios:
Analisis tiempos ejecucion
En las mayoria de los casos se obtiene un mejor tiempo de respuesta de la tabla particionada, y en los casos en los que no, el tiempo de ejecución es practicamente igual al de la tabla no particionada (diferencias de milesimas de segundo). Observar cuando indicamos condiciones fuera del indice (ultima sentencia SQL), como los tiempos de respuesta son aun mas relevantes. Y siempre conforme vamos leyendo de mas particiones (por incluir mas años en la condición), el tiempo de respuesta de la consulta entre una y otra tabla se va acercando.

Particionado de tablas en Oracle

En una entrada anterior del blog vimos los conceptos básicos del particionado de tablas y como se podian llevar a la práctica utilizando MySql. Incluso hicimos una comparativa de tiempos de respuesta con una tabla de 1 millón de registros con y sin particionado. Vamos a ver ahora como implementa Oracle el particionado y algunos ejemplos prácticos de creación de tablas particionadas. Como ya vimos, el particionado es una técnica de optimización que pretende mejorar los tiempos de respuesta de las consultas, y que puede ser especialmente útil en un sistema DW donde las tablas de hechos pueden ser muy grandes.
Tipos de Particionado en Oracle
El particionado fue introducido por primera vez en la versión 8 de Oracle, como una nueva característica DW para la gestión de grandes cantidades de información, y para facilitar la tarea de los administradores de bases de datos. Dependiendo de la versión de Oracle en la que estemos, tenemos diferentes tipos de particionado disponibles:
  • Oracle 8.0: particionado Range.
  • Oracle 8i: además del particionado Range se añaden los tipos Hash y Composite.
  • Oracle 9iR2/10g: se amplian con el tipo List y se permiten nuevas combinaciones de tipos en el particionado Composite.
  • Oracle 11g: se introducen las columnas virtuales para particionar(que no existen fisicamente en la tabla), así como el particionado de Sistema (donde podemos gestionar directamente en que partición de la tabla se insertan los registros) y el particionado por Intervalos.

Particionado de Tablas en Oracle

Basicamente, el particionado se realiza utilizando una clave de particionado (partitioning key), que determina en que partición de las existentes en la tabla van a residir los datos que se insertan. Oracle también permite realizar el particionado de indices y de tablas organizadas por indices. Cada partición ademas puede tener sus propias propiedades de almacenamiento. Las tablas particionadas aparecen en el sistema como una única tabla, realizando el sistema la gestión automatica de lectura y escritura en cada una de las particiones (excepto para el caso de la partición de Sistema introducida en la versión 11g). La definición de las particiones se indica en la sentencia de creación de las tablas, con la sintaxis oportuna para cada uno de los tipos.
  • Particionado Range: la clave de particionado viene determinada por un rango de valores, que determina la partición donde se almacenara un valor.
  • Particionado Hash: la clave de particionado es una función hash, aplicada sobre una columna, que tiene como objetivo realizar una distribución equitativa de los registros sobre las diferentes particiones. Es útil para particionar tablas donde no hay unos criterios de particionado claros, pero en la que se quiere mejor el rendimiento.
  • Particionado List: la clave de particionado es una lista de valores, que determina cada una de las particiones.
  • Particionado Composite: los particionados anteriores eran del tipo simples (single o one-level), pues utilizamos un unico método de particionado sobre una o mas columnas. Oracle nos permite utilizar metodos de particionado compuestos, utilizando un primer particionado de un tipo determinado, y luego para cada particion, realizar un segundo nivel de particionado utilizando otro metodo. Las combinaciones son las siguientes (se han ido ampliando conforme han ido avanzando las versiones): range-hash, range-list, range-range, list-range, list-list, list-hash y hash-hash (introducido en la versión 11g).
  • Particionado Interval: tipo de particionado introducido igualmente en la versión 11g. En lugar de indicar los rangos de valores que van a determinar como se realiza el particionado, el sistema automáticamente creara las particiones cuando se inserte un nuevo registro en la b.d. Las técnicas de este tipo disponible son Interval, Interval List, Interval Range e Interval Hash (por lo que el particionado Interval es complementario a las técnicas de particionado vistas anteriormente).
  • Particionado System: se define la tabla particionada indicando las particiones deseadas, pero no se indica una clave de particionamiento. En este tipo de particionado, se delega la gestión del particionado a las aplicaciones que utilicen la base de datos (por ejemplo, en las sentencias sql de inserción deberemos de indicar en que partición insertamos los datos).
Referente al particionado, y como característica interesante, Oracle nos permite definir sentencias SQL del tipo DML haciendo referencia a las particiones. Es lo que llaman nombres de tabla con extension de partición (partition-extended table names). Por ejemplo, podremos hacer un select sobre una tabla particionada indicando en la sintaxis la partición de la queremos que se haga lectura. Por ejemplo:
SELECT * FROM schema.table PARTITION(part_name);
 
Esto es igualmente válido para las sentencias INSERT, UPDATE, DELETE, LOCK TABLE. Esta sintaxis nos proporciona una forma simple de acceder a las particiones individuales como si fueran tablas, y utilizarlas, por ejemplo, para la creación de vistas (utilizando la vista en lugar de la tabla), lo que nos puede ser util en muchas situaciones.
Vamos a ver un ejemplo de construcción de cada uno de los tipos de particionado.

Particionado Range

Esta forma de particionamiento requiere que los registros estén identificado por un “partition key” relacionado por un predefinido rango de valores. El valor de las columnas “partition key” determina la partición a la cual pertenecerá el registro.
CREATE TABLE sales
  ( prod_id       NUMBER(6)
  , cust_id       NUMBER
  , time_id       DATE
  , channel_id    CHAR(1)
  , promo_id      NUMBER(6)
  , quantity_sold NUMBER(3)
  , amount_sold   NUMBER(10,2)
  )
 PARTITION BY RANGE (time_id)
 ( PARTITION sales_q1_2006 VALUES LESS THAN (TO_DATE('01-APR-2006','dd-MON-yyyy'))     TABLESPACE tsa
 , PARTITION sales_q2_2006 VALUES LESS THAN (TO_DATE('01-JUL-2006','dd-MON-yyyy'))    TABLESPACE tsb
 , PARTITION sales_q3_2006 VALUES LESS THAN (TO_DATE('01-OCT-2006','dd-MON-yyyy'))    TABLESPACE tsc
 , PARTITION sales_q4_2006 VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy'))    TABLESPACE tsd
 );
Este tipo de particionamiento esta mejor situado cuando se tiene datos que tienen rango lógicos y que pueden ser distribuidos por este. Ej. Mes del Año o un valor numérico.

Particionado Hash

Los registros de la tabla tienen su localización física determinada aplicando un valor hash a la columna del partition key. La funcion hash devuelve un valor automatico que determina a que partición irá el registro. Es una forma automática de balancear el particionado. Hay varias formas de construir este particionado. En el ejemplo siguiente vemos una definición sin indicar los nombres de las particiones (solo el número de particiones):
CREATE TABLE dept (deptno NUMBER, deptname VARCHAR(32))
     PARTITION BY HASH(deptno) PARTITIONS 16;
Igualmente, se pueden indicar los nombres de cada particion individual o los tablespaces donde se localizaran cada una de ellas:
CREATE TABLE dept (deptno NUMBER, deptname VARCHAR(32))
     STORAGE (INITIAL 10K)
     PARTITION BY HASH(deptno)
       (PARTITION p1 TABLESPACE ts1, PARTITION p2 TABLESPACE ts2,
        PARTITION p3 TABLESPACE ts1, PARTITION p4 TABLESPACE ts3);

Particionado List

Este tipo de particionado fue añadido por Oracle en la versión 9, permitiendo determinar el particionado según una lista de valores definidos sobre el valor de una columna especifica.
CREATE TABLE sales_list (salesman_id NUMBER(5), salesman_name VARCHAR2(30),
sales_state VARCHAR2(20),
sales_amount NUMBER(10),
sales_date DATE)
PARTITION BY LIST(sales_state)
(
PARTITION sales_west VALUES('California', 'Hawaii'),
PARTITION sales_east VALUES ('New York', 'Virginia', 'Florida'),
PARTITION sales_central VALUES('Texas', 'Illinois')
PARTITION sales_other VALUES(DEFAULT)
);
Este particionado tiene algunas limitaciones, como que no soporta múltiples columnas en la clave de particionado (como en los otros tipos), los valores literales deben ser únicos en la lista, permitiendo el uso del valor NULL (aunque no el valor MAXVALUE, que si puede ser utilizado en particiones del tipo Range). El valor DEFAULT sirve para definir la partición donde iran el resto de registros que no cumplen ninguna condición de las diferentes particiones.

Particionado Composite

Este tipo de particionado es compuesto, pues se conjuga el uso de dos particionados a la vez. Veamos un ejemplo utilizando el tipo RANGE y el HASH. En primer lugar, hace un particionado del tipo RANGE utilizando rangos de años. En segundo lugar, para cada partición definida por cada año, hacemos un segundo particionado (subparticion) del tipo aleatorio (HASH) por el valor de otra columna:
  
  CREATE TABLE TAB2 (ord_id     NUMBER(10),
     ord_day    NUMBER(2),
     ord_month  NUMBER(2),
     ord_year   NUMBER(4)
     )
  PARTITION BY RANGE(ord_year)
  SUBPARTITION BY HASH(ord_id)
  SUBPARTITIONS 8
   ( PARTITION q1 VALUES LESS THAN(2001)
     ( SUBPARTITION q1_h1 TABLESPACE TBS1,
       SUBPARTITION q1_h2 TABLESPACE TBS2,
       SUBPARTITION q1_h3 TABLESPACE TBS3,
       SUBPARTITION q1_h4 TABLESPACE TBS4
     ),
     PARTITION q2 VALUES LESS THAN(2002) 
     ( SUBPARTITION q2_h5 TABLESPACE TBS5,
       SUBPARTITION q2_h6 TABLESPACE TBS6,
       SUBPARTITION q2_h7 TABLESPACE TBS7,
       SUBPARTITION q2_h8 TABLESPACE TBS8
     ),     PARTITION q3 VALUES LESS THAN(2003) 
     ( SUBPARTITION q3_h1 TABLESPACE TBS1,
       SUBPARTITION q3_h2 TABLESPACE TBS2,
       SUBPARTITION q3_h3 TABLESPACE TBS3,
       SUBPARTITION q3_h4 TABLESPACE TBS4
     ),
     PARTITION q4 VALUES LESS THAN(2004)
     ( SUBPARTITION q4_h5 TABLESPACE TBS5,
       SUBPARTITION q4_h6 TABLESPACE TBS6,
       SUBPARTITION q4_h7 TABLESPACE TBS7,
       SUBPARTITION q4_h8 TABLESPACE TBS8
     )   )
Las combinaciones permitidas son las siguientes (se han ido ampliando conforme han ido avanzando las versiones de Oracle): range-hash, range-list, range-range, list-range, list-list, list-hash y hash-hash (introducido en la versión 11g).
Particionado Composite en Oracle

Particionado Interval

El particionado Interval ha sido introducido en la versión 11g para habilitar un mantenimiento de particiones desasistido. Normalmente, cuando realizamos un particionado sobre una tabla, indicamos una lista de valores o rangos para crear de antemano las particiones. Posteriormente, ajustamos la definición de las particiones para incluir nuevas para nuevos rangos o valores. Con las particiones Interval, preparamos para que Oracle cree las particiones de forma automática cuando lo necesite. Básicamente, se define un intervalo y una directiva para decirle a Oracle como se tiene que comportar. Veamos un ejemplo:
 CREATE TABLE T_11G(C1 NUMBER(38,0),
 C2 VARCHAR2(10),
 C3 DATE)
 PARTITION BY RANGE (C3) INTERVAL (NUMTOYMINTERVAL(1,'MONTH'))
 (PARTITION P0902 VALUES LESS THAN (TO_DATE('2009-03-01 00:00:00','YYYY-MM-DD HH24:MI:SS')));
Hemos creado una partición base, y con lo especificado en Interval definimos como gestionar la creación automática de nuevas particiones. La posibilidad de definir un intevalo y que Oracle se encargue de crear las particiones a medida que se vayan necesitando resulta muy interesante para facilitar el mantenimiento y administración de particiones.

Particionado System

Una de las nuevas funcionalidades introducida en la version 11g es el denominado partitioning interno o de sistema. En este particionado Oracle no realiza la gestión del lugar donde se almacenaran los registros, sino que seremos nosotros los que tendremos que indicar en que partición se hacen las inserciones.
create table t (c1 int,
                c2 varchar2(10),
                c3 date)
     partition by system
    (partition p1,
     partition p2,
     partition p3);
Si hicieramos un insert sobre la tabla (por ejemplo, insert into t values (1,’A',sysdate);), daría error, siendo la instrucción a ejecutar correcta la siguiente:
insert into t partition (p3) values (1,’A',sysdate);
Puede ser util este particionado para aplicaciones donde nos interesa ser nosotros lo que gestionamos la forma en la que se realiza el particionado (lógica de aplicación).

Uso de columnas virtuales para particionar

En la versión 11g se pueden definir en las tablas columnas virtuales (no existen físicamente). Ademas estas columnas se pueden utilizar para realizar particionado sobre ellas. La forma de crear una tabla con columnas de este tipo sería la siguiente:
create table t (c1 int,
                c2 varchar2(10),
                c3 date,
                c3_v char(1)
                generated always as
                (to_char(c3,'d')) virtual
                )
 partition by list (c3_v)
  (partition p1 values ('1'),
   partition p2 values ('2'),
   partition p3 values ('3'),
   partition p4 values ('4'),
   partition p5 values ('5'),
   partition p6 values ('6'),
   partition p7 values ('7') );
Les  recomiendo la lectura de la entrada del blog OraMDQ donde Pablo Rovedo habla en profundidad sobre las nuevas funcionalidades de particionado de la version 11g de Oracle, incluyendo unos completos ejemplos prácticos.

Gestión del particionado

La gestión del particionado es totalmente dinámica, de forma que se podrán añadir particiones a una tabla particionada existente, juntar o borrar particiones, convertir una particion en una tabla no particionada, partir una partición en dos (Splitting), hacer un truncate (borra los datos de la partición pero deja la estructura). También podemos mover una partición de un tablespace a otro, renombrarla, etc. Os recomiendo la lectura de blog Bases de Datos y Tecnología donde se explican en detalle algunas de estas operaciones, así como el blog Database Design que también habla sobre el tema).
El particionado en Oracle tiene muchas mas funcionalidades de las que podeis ampliar información en la propia documentación online del fabricante (Oracle 10g y Oracle 11g)

jueves, 7 de marzo de 2013

Que es una bitacora ( relacionada con SGBD)

Las bitácoras son fundamentales en lo que es la administración de bases de datos, pues con estas se puede tener un registro físicamente de todos los usuarios u objetos que se encuentren en determinada base de datos, esto nos sería muy útil en caso de pérdida de usuarios u objetos y sus dueños así como los roles que desempeñan dentro del gestor. Asimismo si ocurriera algún imprevisto en la base de datos o que A no llegara a estar disponible, una que se puede y checar diseño a datos el de u registro que se lleva con la bitácora. continuación los mostraremos privilegios proposición en formato de una bitácora que nos permitirá registrar a los usuarios, tiene cuanto objetos de la base de datos, así como a la BD a la que pertenece y el rol que juega dentro de la misma. Es una bitácora sencilla pero muy útil pues contiene lo fundamental para hacer un registro muy completo y sin complejidades.
.

Comparar partición de disco y sistema de archivos.


PARTICIONES Y SISTEMAS DE ARCHIVOS
1.- Explica las diferencias que hay entre una partición primaria, una partición lógica y una extendida.
Partición Primaria: Partición que puede contener los archivos necesarios para arrancar el sistema y que no puede ser subdividida.
Partición Lógica: Partición que existe dentro de una partición extendida. PARTICIONES PRIMARIAS:
Partición Extendida: Partición que no puede contener los archivos necesarios para arrancar el sistema y que puede ser a su vez subdividida en unidades lógicas..
Estas son las particiones
2.- Explica las opciones del fdisk de Microsoft
3.- Indica cuál es la nomenclatura que utiliza Windows y Linux para nombrar las
unidades de disco.
NOMENCLATURA WINDOWS
Las particiones de un disco duro son "trozos" del mismo cuyo principal fin debiera ser la de albergar distintos sistemas de ficheros (distintos sistemas operativos) incompatibles entre sí, que no pueden convivir en la misma partición.
   Particionar un disco duro consiste en dividir al mismo en distintos "trozos". Existen dos tipos de particiones, particiones primarias y particiones extendidas. Las particiones primarias sirven para albergar sistemas operativos y datos de programa, todo disco duro tiene al menos una partición primaria para contener datos y la mayor parte de los usuarios disponen de una única partición con el tamaño total del disco duro. El número máximo de particiones primarias es 4. Fué este número tan pequeño el que originó la aparición de las particiones extendidas, las cuales se utilizan para alargar el número máximo de particiones hasta el infinito (en la práctica no se aconseja un número de particiones superior a 12), puesto que una partición extendida puede contener tantas particiones primarias (denominadas en esta caso unidades lógicas) como se quiera.
    A veces aún poseyendo un único sistema operativo, si el disco duro tiene una gran capacidad, entonces, bien por antiguas exigencias del propio sistema operativo incapaz de crear particiones primarias tan grandes tales como la capacidad total de un disco duro grande, bien por razones de optimización(se obtiene mayor rendimiento de un disco duro particionado en varios trozos, tanto por velocidad de acceso como por un mejor aprovechamiento del espacio disponible), a veces se recurre a la creación de una partición extendida. A partir de una partición extendida se crean unidades lógicas para poder acceder a ese espacio. En el caso más simple se crea una unidad lógica con la capacidad total de la partición extendida., tal y como expresa el siguiente gráfico:
'Particiones y sistemas de archivos'

En otros casos se divide la partición en un mayor número de unidades lógicas (D: , E:) , (D: , E: , F:) , etc.
    Nota: En el ejemplo anterior se han expresado las distintas particiones según la nomenclatura de MS-DOS/Windows. Sin embargo, Linux utiliza otro tipo de nomenclatura, que se sería, siguiendo el ejemplo anterior del gráfico:
NOMENCLATURA LINUX
C: -> hda1
D: -> hda3
hda2 , sería la partición extendida
    Semática:
        hda    -> hard disk A ( disco duro principal/maestro/master )
        hda1  -> hard disk A, partition 1 ( partición primera del disco duro principal/maestro/master )
        hda2  -> hard disk A, partition 2 ( partición segunda del disco duro principal/maestro/master)
    Es fácil deducir que si nuestro CDROM se encuentra instalado como esclavo/slave del disco duro maestro, su denominación será hdb.
Al contrario que en MS-DOS/Windows, en Linux, para acceder a los distintos dispositivos de nuestra máquina, no se utilizan letras del alfabeto,
como pudieran ser C: o D:. Linux incluye a los dispositivos dentro de la propia estructura de ficheros, de tal forma que los dispositivos
se encuentran todos "colgando" del directorio "dev", utilizando la siguiente nomenclatura para identificar a los distintos dispositivos y particiones de nuestra máquina:
    En general, para los discos duros IDE es : /dev/hdXY donde es la situación del disco duro en el BUS IDE e es un número de partición.
    En particular:
 
ELEMENTO
NOMBRE/UBICACIÓN
Maestro del canal 1 IDE  (disco duro principal )
/dev/hda
Primera partición del dispositivo maestro del canal 1 IDE (C:)
/dev/hda1
Segunda partición del dispositivo maestro del canal 1 IDE
/dev/hda2
... (hasta 4 posibles particiones)
... (hasta 4 posibles particiones)
Primera unidad lógica del dispositivo maestro del canal 1 IDE
/dev/hda5
Esclavo del canal 1 IDE  (CDROM normalmente)
/dev/hdb
Primera partición del dispositivo esclavo del canal 1 IDE
/dev/hdb1
Segunda partición del dispositivo esclavo del canal 1 IDE
/dev/hdb2
... (hasta 4 posibles particiones)
... (hasta 4 posibles particiones)
Primera unidad lógica del dispositivo esclavo del canal 1 IDE
/dev/hdb5
Para el canal 2 IDE sería exactamente igual
/dev/hdc (maestro)  /dev/hdd (esclavo)
Para dispositivos SCSI exactamente igual que para dispositivos IDE
/dev/sda o /dev/scd0 (dispositivo 1), /dev/sdb o /dev/scd1 (dispositivo 2), /dev/sdco /dev/scd2(dispositivo 3), etc
Primera unidad de disco flexible (A:)
/dev/fd0
Primera unidad de disco flexible (B:)
/dev/fd1
Primer puerto serie (COM 1, el ratón, normalmente)
/dev/ttyS0 o /dev/cua0
Segundo puerto serie (COM 2, el modem, normalmente)
/dev/ttyS1 o /dev/cua1
Tercer puerto serie (COM 3)
/dev/ttyS2 o /dev/cua2
Cuarto puerto serie (COM 4)
/dev/ttyS3 o /dev/cua3
Pueto para ratón tipo PS/2
/dev/psaux
Primer puerto paralelo (LPT 1)
/dev/lp1 /dev/lp0 (Versiones Linux con kernel 2.2.x)
Segundo puerto paralelo(LPT2)
/dev/lp2 /dev/lp1 (Versiones Linux con kernel 2.2.x)