Korzystanie z zapytań podrzędnych w Direct Discovery

Jeśli liczebność pola klucza łączącego tabelę jest wysoka, czyli pole to zawiera dużą liczbę odrębnych wartości, dokonanie selekcji w Qlik Sense może wygenerować bardzo dużą instrukcję SQL, ponieważ klauzula WHERE key_field IN może zawierać bardzo dużo wartości. W takim przypadku ewentualnym rozwiązaniem może być zezwolenie Qlik Sense na tworzenie zapytań podrzędnych.

Aby zilustrować to działanie, w przykładzie tym tabela produktów (ProductTable) jest powiązana z tabelą zamówień sprzedaży (SalesOrderDetail) za pomocą pól identyfikatorów produktów (ProductID) (obie tabele są w trybie Direct Discovery).

Two linked tables.

Utworzono również wykres z wymiarem OrderMonth i miarą Sum(Subtotal) oraz pole filtru na potrzeby selekcji wartości Size.

A filter box, a bar chart and a table.

Scenariusz 1: Niska liczebność

W tym scenariuszu tabela produktów zawiera niską liczbę odrębnych produktów (266). Po dokonaniu selekcji wartości Size Direct Discovery generuje instrukcję SQL w celu zwrócenia odpowiednich danych korzystającą z klauzuli WHERE ProductID IN zawierającej identyfikatory produktów odpowiadające wybranemu rozmiarowi (w tym wypadku jest to 19 produktów).

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

Wygenerowane zapytanie SQL jest następujące:

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

Scenariusz 2: Korzystanie z zapytań podrzędnych

Jeśli w tym samym przykładzie liczba odrębnych produktów byłaby wyższa, na przykład 20 tys., wybranie filtra wymiaru, na przykład Size, wygenerowałoby instrukcję SQL z klauzulą WHERE ProductID IN zawierającą tysiące identyfikatorów produktów. Wynikowa instrukcja byłaby zbyt duża, aby zostać przetworzona przez źródło danych ze względu na ograniczenia lub problemy dotyczące pamięci lub wydajności.

W zamian można zezwolić Qlik Sense na utworzenie zapytań podrzędnych. W tym celu należy nadać parametrowi DirectEnableSubquery wartość true. Wygenerowana instrukcja SQL może być następująca:

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

Rozmiar klauzuli WHERE ProductID IN nie zależy już od liczby kluczy wynikającej z dokonanej selekcji.

Stosowanie zapytań podrzędnych wiąże się z następującymi ograniczeniami:

  • Składnia zapytań podrzędnych jest wywoływana tylko po dokonaniu selekcji danych obejmującym filtrowanie wykresu za pomocą danych z innej tabeli.
  • Czynnikiem decydującym jest ilość danych w kluczach, a nie liczba kluczy.
  • Zapytania podrzędne są wywoływane tylko wówczas, gdy wszystkie stosowne tabele są w trybie Direct Discovery. Jeśli wykres jest filtrowany za pomocą danych z tabeli w trybie opartym na pamięci głównej, wygenerowana zostanie klauzula IN.