使用子查詢和 Direct Discovery

如果聯結表格的索引鍵欄位的基數高,即它包含大量相異值,在 Qlik Sense 中的一個選取可能會產生非常大的 SQL 陳述式,因為 WHERE key_field IN 子句可能包含大量的值。這種情況下,一種可能的解決方案是將 Qlik Sense 改為建立子查詢。

我們舉例來說明這一點,一個產品表格 (ProductTable) 使用產品 ID (ProductID) 連結到銷售訂單表格 (SalesOrderDetail),兩個表格均在 Direct Discovery 模式下使用。

Two linked tables.

我們建立一個以 OrderMonth 為維度、以 Sum(Subtotal) 為量值的圖表,以及一個用於選取 Size 的篩選方塊。

A filter box, a bar chart and a table.

情境 1:低基數

在此案例中,產品表格包含數量較少的不同產品,266 種。如果我們在 Size 中進行選取,Direct Discovery 會使用包含符合所選大小 (在此案例中為 19 種產品) 的產品 ID 的 WHERE ProductID IN 子句,產生一個 SQL 陳述式以傳回資料。

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

所產生的 SQL 如下所示:

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

情境 2:使用子查詢

如果同樣的例子中包含數量較大的不同產品 (例如 20.000 種),選取一個維度篩選器 (例如 Size),會使用包含數以千計產品 ID 的 WHERE ProductID IN 子句產生一個 SQL 陳述式。產生的陳述式可能過大,並因為記憶體或效能的限制或問題而無法被資料來源處理。

解決方案是將 DirectEnableSubquery 設為 true,使 Qlik Sense 轉而建立子查詢。這時,產生 SQL 陳述式就會如下所示:

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

WHERE ProductID IN 子句大小不再取決於選項產生的索引鍵數量。

使用子查詢有以下限制:

  • 只有您的資料選取涉及使用另一表格的資料篩選圖表時,才能調用子查詢語法。
  • 索引鍵內的資料量是決定因素,而非索引鍵數量。
  • 只有所有涉及的表格均處於 Direct Discovery 模式時,才能調用子查詢。如果您使用處於記憶體模式的表格中的資料來篩選圖表,將會產生 IN 子句。