Utilizzo delle sottoquery con Direct Discovery

Se il livello di cardinalità del campo chiave che unisce la tabella è elevato, vale a dire che contiene un gran numero di valori distinti, una selezione in Qlik Sense potrebbe generare un'istruzione SQL estremamente lunga dato che la clausola WHERE key_field IN è in grado di contenere molti valori. In questo caso, una soluzione potrebbe consistere nel lasciare che Qlik Sense crei delle sottoquery.

Per maggiore chiarezza viene presentato un esempio in cui la tabella dei prodotti (ProductTable) è collegata a una tabella degli ordini delle vendite (SalesOrderDetail) utilizzando un ID prodotto (ProductID), in cui entrambe le tabelle si trovano in modalità Direct Discovery.

Two linked tables.

Viene creato un grafico con OrderMonth come dimensione e Sum(Subtotal) come misura e una casella di filtro per la selezione di Size.

A filter box, a bar chart and a table.

Scenario 1: Cardinalità bassa

In questo scenario la tabella dei prodotti contiene un numero ridotto di prodotti: 266. Se si seleziona Size, Direct Discovery genera un'istruzione SQL per restituire i dati utilizzando una clausola WHERE ProductID IN contenente l'ID prodotto corrispondente alle dimensioni selezionate, in questo caso 19 prodotti.

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

L'istruzione SQL generata presenta l'aspetto seguente:

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])

Scenario 2: Utilizzo delle sottoquery

Se lo stesso esempio contiene un numero elevato di prodotti differenti, ad esempio 20.000, la selezione di un filtro della dimensione, ad esempio Size genererebbe un'istruzione SQL con una clausola WHERE ProductID IN contenente migliaia di ID prodotto. L'istruzione risultante potrebbe essere troppo lunga per essere gestita dalla sorgente dati a causa di limitazioni o problemi di memoria o prestazioni.

La soluzione è quella di lasciare che Qlik Sense crei le sottostringhe impostando DirectEnableSubquery su true. L'istruzione SQL generata potrebbe presentare l'aspetto seguente:

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])
 

Le dimensioni della clausola WHERE ProductID IN non dipendono più dal numero di chiavi risultanti dalla selezione.

Quando si utilizzano le sottoquery vengono applicate le limitazioni seguenti:

  • La sintassi della sottoquery viene richiamata solo quando si selezionano dati che implicano il filtraggio di un grafico mediante dati di un'altra tabella.
  • Il fattore determinante è la quantità di dati all'interno delle chiavi e non il numero di chiavi.
  • Le sottoquery vengono richiamate solo se tutte le tabelle interessate si trovano in modalità Direct Discovery. Se si filtra il grafico utilizzando i dati da una tabella inclusa nella modalità in memoria, verrà generata una clausola IN.