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.
Creamos un gráfico con OrderMonth como dimensión y Sum(Subtotal) como medida, y un cuadro de filtro para seleccionar Size.
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.
El SQL generado presenta el siguiente aspecto:
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:
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.