Saltar al contenido principal Saltar al contenido complementario

Utilizar subconsultas con Direct Discovery

Si la cardinalidad del campo clave que se une a la tabla es alta, es decir, contiene un gran número de valores distintos, una selección en Qlik Sense puede generar una sentencia SQL muy grande, ya que la cláusula WHERE key_field IN puede contener un gran número de valores. En este caso una posible solución es dejar que Qlik Sense cree subconsultas en vez.

Para ilustrarlo, utilizaremos un ejemplo en el que una tabla de productos (ProductTable) está vinculada a una tabla de pedidos de venta (SalesOrderDetail) mediante un identificador de producto (ProductID), y ambas tablas se utilizan en el modo Direct Discovery.

Dos tablas vinculadas.

Creamos un gráfico con OrderMonth como dimensión y Sum(Subtotal) como medida, y un cuadro de filtro para seleccionar Size.

Un cuadro de filtro, un gráfico de barras y una tabla.

Escenario 1: Baja cardinalidad

En este escenario, la tabla de productos contiene un número reducido de productos distintos, 266. Si realizamos una selección en Size, Direct Discovery genera una sentencia SQL para devolver los datos, utilizando una cláusula WHERE ProductID IN que contiene los ID de los productos que coinciden con el tamaño seleccionado, en este caso 19 productos.

Un cuadro de filtro con las selecciones realizadas, un gráfico de barras y una tabla.

El SQL que se genera tiene este aspecto:

SELECT ProductID, month([OrderDate]), SUM(OrderQty), SUM(SubTotal)
FROM SalesTable
WHERE ProductID IN ( 12, 51, 67, 81, 89, 92, 100, 108, 142, 150, 151, 162, 191, 206, 220, 222, 251, 254)
GROUP BY ProductID, month([OrderDate])

Escenario 2: Utilizar subconsultas

Si el mismo ejemplo contiene un número elevado de productos distintos, por ejemplo 20.000, la selección de un filtro de dimensión, Size por ejemplo, generaría una sentencia SQL con una cláusula WHERE ProductID IN que contendría miles de ID de productos. La sentencia resultante podría ser demasiado extensa para que la gestione la fuente de datos, debido a limitaciones de memoria o problemas de rendimiento.

La solución está en permitir que Qlik Sense cree subconsultas en vez, configurando DirectEnableSubquery como verdadero. La sentencia SQL generada en su lugar podría presentar el siguiente aspecto:

SELECT ProductID, month([OrderDate]), SUM(OrderQty), SUM(SubTotal)
FROM SalesTable
WHERE ProductID IN
( SELECT DISTINCT "AW2012"."dbo"."PRODUCT"."PRODUCTID" WHERE "AW2012"."dbo"."PRODUCT"."SIZE" IN (3))
GROUP BY ProductID, month([OrderDate])
 

El tamaño de la cláusula WHERE ProductID IN ya no depende del número de claves resultantes de la selección.

Al utilizar subconsultas hemos de tener en cuenta las siguientes limitaciones:

  • Solo debemos invocar la sintaxis de subconsultas cuando seleccionemos datos que impliquen filtrar un gráfico usando datos de otra tabla.
  • La cantidad de datos dentro de las claves es el factor determinante, no el número de claves.
  • Las subconsultas solo se invocan si todas las tablas implicadas están en modo Direct Discovery. Si filtramos el gráfico utilizando datos de una tabla incluida en el modo de memoria, se generará una cláusula IN.

¿Esta página le ha sido útil?

Si encuentra algún problema con esta página o su contenido (errores tipográficos, pasos que faltan o errores técnicos), no dude en ponerse en contacto con nosotros.