使用子查詢和 Direct Discovery
如果聯結表格的索引鍵欄位的基數高,即它包含大量相異值,在 Qlik Sense 中的一個選取可能會產生非常大的 SQL 陳述式,因為 WHERE key_field IN 子句可能包含大量的值。這種情況下,一種可能的解決方案是將 Qlik Sense 改為建立子查詢。
我們舉例來說明這一點,一個產品表格 (ProductTable) 使用產品 ID (ProductID) 連結到銷售訂單表格 (SalesOrderDetail),兩個表格均在 Direct Discovery 模式下使用。
我們建立一個以 OrderMonth 為維度、以 Sum(Subtotal) 為量值的圖表,以及一個用於選取 Size 的篩選方塊。
情境 1:低基數
在此案例中,產品表格包含數量較少的不同產品,266 種。如果我們在 Size 中進行選取,Direct Discovery 會使用包含符合所選大小 (在此案例中為 19 種產品) 的產品 ID 的 WHERE ProductID IN 子句,產生一個 SQL 陳述式以傳回資料。
所產生的 SQL 如下所示:
情境 2:使用子查詢
如果同樣的例子中包含數量較大的不同產品 (例如 20.000 種),選取一個維度篩選器 (例如 Size),會使用包含數以千計產品 ID 的 WHERE ProductID IN 子句產生一個 SQL 陳述式。產生的陳述式可能過大,並因為記憶體或效能的限制或問題而無法被資料來源處理。
解決方案是將 DirectEnableSubquery 設為 true,使 Qlik Sense 轉而建立子查詢。這時,產生 SQL 陳述式就會如下所示:
WHERE ProductID IN 子句大小不再取決於選項產生的索引鍵數量。
使用子查詢有以下限制:
- 只有您的資料選取涉及使用另一表格的資料篩選圖表時,才能調用子查詢語法。
- 索引鍵內的資料量是決定因素,而非索引鍵數量。
- 只有所有涉及的表格均處於 Direct Discovery 模式時,才能調用子查詢。如果您使用處於記憶體模式的表格中的資料來篩選圖表,將會產生 IN 子句。