Acerca de Tablas Locales

Las tablas locales se han incorporado para simplificar la extracción de datos y mejorar el desempeño durante la construcción de datamarts. Esto resuelve los problemas resultantes del uso de consultas complejas en bases de datos transaccionales que pueden dar malos resultados.

Al definir tablas locales, es posible almacenar datos del proceso de construcción en memoria para usar en el cálculo de campos virtuales. (Ver Campos Virtuales).

Una tabla local es un conjunto de registros con campos y campos clave. Es posible acceder a un registro usando el valor clave. Esto le permite, por ejemplo, almacenar una tabla que representa una relación entre un código incluido en una fuente de medidas y otro que no está incluido pero que es necesario para la construcción del datamart porque identifica a una dimensión del datamart. De este modo se evita la necesidad de hacer una unión (JOIN) en la consulta de medidas con la tabla de relaciones.

Use las fuentes de datos del modelo para definir las tablas locales. Es posible usar fuentes de datos preexistentes o fuentes de datos nuevas definidas exclusivamente para usar como tablas locales.

(warning) Nota
Debido a que las tablas locales se almacenan en la memoria, se recomienda usar estas tablas para almacenar catálogos o relaciones entre identidades. A menos que la cantidad de datos sea pequeña, no es recomendable almacenar el resultado de fuentes que proporcionan las medidas para construir la tabla local.

¿Cómo usar las Tablas Locales?

Este es un ejemplo del uso de una tabla local para simplificar una consulta SQL. La técnica de extracción de datos utilizada para este ejemplo sencillo, también es aplicable a casos más complejos.

La siguiente consulta debe hacerse para la fuente de medidas de un modelo multidimensional de análisis:

SELECT F.Fecha, I.CodProducto, R.Representantes, C.Ramo, I.Cantidad
FROM Facturas F, Items I, Productos P, Representantes R, Clientes C
WHERE F.Numero = I.NroFactura
AND F.Emitida = TRUE
AND F.Tipo = 2
AND F.CodCliente = C.CodCliente
AND I.CodProducto = P.CodProducto
AND P.TipoProducto = R.TipoProducto
AND C.CodCliente = R.CodCliente
AND R.FechaValidez = (SELECT MAX(R2.FechaValidez)
                      FROM Representantes R2
                      WHERE R2.TipoProducto = R.TipoProducto
                      AND R2.CodCliente = R.CodCliente)

La complejidad de la consulta anterior está definida por tres elementos:

  • La tabla de Clientes está incluida en el JOIN de la consulta simplemente para obtener el Ramo del Cliente.
  • La tabla de Productos está incluida en el JOIN, ya que tiene el Tipo de Producto y el Representante de Ventas (así como también el Cliente y la Fecha) depende del Tipo de Producto vendido.
  • La asignación del Representante de Ventas, además de estar determinada por el Cliente y el Tipo de Producto, cambia con el tiempo, por lo tanto es necesario determinar un Representante válido o el más reciente.

El uso de tablas locales puede reducir la complejidad de ésta consulta.

Primero, se deben definir dos tablas locales:

(K) indica el campo clave de la tabla local.

Tabla 1

Nombre

Clientes

Consulta

SELECT CodCliente, Ramo
FROM Clientes

Campos

CodCliente (K)
Ramo

Tabla 2

Nombre

Representante

Consulta

SELECT R.CodCliente, R.Representante, P.CodProductoFROM Representante R, Productos P
WHERE P.TipoProducto = R.TipoProducto
AND R.FechaValidez = (SELECT MAX(R2.FechaValidez)
                               FROM Representante R2
                               WHERE R2.CodCliente = R.CodCliente
                               AND R2.TipoProducto = R.TipoProducto)

Campos

CodCliente (K)
CodProducto (K)
Representante


Luego se deben definir los siguientes campos virtuales:

Ramo = BuscarCampo("Clientes", "Ramo", CodCliente)
Rep = BuscarCampo("Representantes", "Representante", CodCliente, CodProducto)

Y sustituir la consulta SQL de fuente de medidas por la siguiente consulta:

SELECT F.Fecha, I.CodProducto, I.Cantidad, F.CodCliente
FROM Facturas F, Items I
WHERE F.Numero = I.NroFactura AND F.Emitida = TRUE AND F.Tipo = 2

La consulta ahora es más simple, y como los campos virtuales Ramo y Rep tienen los campos CodCliente y CodProducto como claves incluidas en la consulta, se calcularán para cada registro resultante de la consulta y serán agregados como campos adicionales.

Definiendo Tablas Locales

Para definir una tabla local se utiliza la sección de definición de Campos del panel de propiedades de la fuente de datos.

Para definir una tabla local:

  1. Seleccionar la rama fuente de datos en el Árbol de Diseño. Aparece el panel de propiedades para la fuente de datos.
  2. Seleccionar la sección de definición de Campos del panel de propiedades.
  3. Marcar la casilla Tabla Local. El panel de propiedades se actualiza para incluir las columnas Clave de Tabla y Campo de Tabla. En la pestaña General, la casilla Dimensión se sustituye por la casilla Sólo para Tabla.
  4. Ingresar el nombre de la tabla.
  5. Marcar las casillas Campo de Tabla para todos los campos de la fuente de datos que son parte de la tabla local.
  6. Marcar las casillas Clave de Tabla para todos los campos en la fuente de datos que son claves para la tabla local.
  7. Indicar si se deben notificar las fallas. Una falla al acceder a una Tabla Local ocurre cuando la búsqueda de un elemento es infructuosa, es decir cuando el elemento buscado no se encuentra en la tabla.

Es importante recordar que:

  • Cada tabla local se construye desde una sola fuente de datos.
  • Es necesario tener al menos dos campos en la tabla local, uno de clave y otro como campo a buscar
  • Se debe definir al menos un campo como clave en una tabla local. Las claves pueden ser múltiples, en cuyo caso el orden en que aparecen los campos es importante y coincide con el orden en que se pasan los parámetros de la función "BuscarCampo" en los Campos Virtuales
  • Marque la casilla "Solo para Tabla" para indicar que la fuente de datos se usa solamente para la creación de la tabla local y no se usan datos directamente para la construcción de cubos.