Verwenden von Unterabfragen in Direct Discovery

Wenn die Kardinalität des Schlüsselfelds, das die Tabellen verbindet, hoch ist, d. h., wenn es eine große Anzahl von distinkten Werten enthält, kann eine Auswahl in Qlik Sense einen sehr großen SQL-Befehl zur Folge haben, weil die WHERE key_field IN-Bedingung eine große Anzahl von Werten umfasst. In diesem Fall besteht eine mögliche Lösung darin, Qlik Sense stattdessen mehrere Unterabfragen generieren zu lassen.

Wir veranschaulichen dies anhand einer Produkttabelle (ProductTable), die über eine Produkt-ID (SalesOrderDetail) mit einer Auftragstabelle verlinkt ist (ProductID), wobei beide Tabellen im Direct Discovery-Modus sind.

Two linked tables.

Wir erstellen ein Diagramm mit OrderMonth als Dimension und Sum(Subtotal) als Kennzahl und verwenden eine Filterbox zur Auswahl von Size.

A filter box, a bar chart and a table.

Szenario 1: niedrige Kardinalität

In diesem Szenario enthält die Produkttabelle eine geringe Anzahl an distinkten Produkten, 266. Wenn wir eine Auswahl in Size treffen, generiert Direct Discovery einen SQL-Befehl zur Lieferung der Daten und verwendet dafür eine WHERE ProductID IN-Bedingung, die Produkt-IDs in der ausgewählten Größe enthält, in diesem Fall 19 Produkte.

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

Das generierte SQL sieht wie folgt aus:

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

Szenario 2: Verwenden von Unterabfragen

Wenn dasselbe Beispiel eine große Anzahl an distinkten Produkten enthält, zum Beispiel 20.000, lässt sich durch die Auswahl eines Dimensionsfilters, zum Beispiel Size, ein SQL-Befehl mit einer WHERE ProductID IN-Bedingung generieren, die Tausende Produkt-IDs umfasst. Der daraus resultierende Befehl könnte aufgrund von Speicher- oder Leistungsbeschränkungen zu groß für die Verarbeitung durch die Datenquelle sein.

Die Lösung besteht darin, von Qlik Sense Unterabfragen erstellen zu lassen. Dazu muss DirectEnableSubquery auf "true" gesetzt werden. Der generierte SQL-Befehl könnte dann wie folgt aussehen:

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

Die Größe der WHERE ProductID IN-Bedingung ist nun nicht mehr von der Anzahl der Schlüssel als Resultat der Auswahl abhängig.

Die folgenden Einschränkungen gelten bei der Verwendung von Unterabfragen:

  • Die Syntax der Unterabfrage wird nur aufgerufen, wenn Sie Daten auswählen, die das Filtern eines Diagramms nach Daten einer anderen Tabelle umfassen.
  • Die Datenmenge innerhalb der Schlüssel ist der begrenzende Faktor, nicht die Schlüsselanzahl.
  • Unterabfragen werden nur aufgerufen, wenn alle beteiligten Tabellen im Direct Discovery-Modus sind. Wenn Sie das Diagramm nach den Daten einer Tabelle im In-Memory-Modus filtern, wird eine IN-Bedingung generiert.