Utilizar subconsultas con Direct Discovery

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

Para ilustrar esto, usamos un ejemplo donde una tabla de productos (ProductTable) está vinculada a una tabla de pedidos de venta (SalesOrderDetail) usando una identificación de producto (ProductID), con ambas tablas usadas en modo Direct Discovery.

Two linked tables.

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

A filter box, a bar chart and a table.

Escenario 1: Baja cardinalidad

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

A filter box with selections made,  a bar chart and a table.

El SQL generado presenta el siguiente 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 una gran cantidad de productos distintos, por ejemplo 20.000, la selección de un filtro de dimensión, por ejemplo Size, generaría una sentencia SQL con una cláusula WHERE ProductID IN que contiene miles de ID de productos. La sentencia resultante podría ser demasiado extensa para que lla gestione la fuente de datos debido a limitaciones o problemas de memoria o rendimiento.

La solución está en permitir que Qlik Sense cree subconsultas en vez, configurando DirectEnableSubquery como verdadero. La sentencia SQL generada 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:

  • Sólo 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 sólo 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.