透過 Direct Discovery使用子查詢

如果聯結表格之重要欄位的基數很高,也就是包含較大數量的唯一值,QlikView中的選項就會產生非常大的 SQL 陳述式,因為WHERE key_field IN 子句可能會包含較大的值。在此情況下,可能的解決方案是讓 QlikView改為建立子查詢。

為了說明此情況,我們將使用一個範例,其中的產品表格 (ProductTable) 透過產品識別碼 (ProductID) 連結到銷售訂單表格 (SalesOrderDetail),而且兩個表格都用於 Direct Discovery 模式。

我們使用 OrderMonth作為維度、Sum(Subtotal) 作為量值以及一個用來選取 Size 的篩選框等內容,建立一個表格。

案例 1:低基數

在此案例中,產品表格包含低數量的唯一產品 (266)。如果我們在 Size進行選取,Direct Discovery 便會使用包含符合所選大小之產品識別碼的 WHERE ProductID IN 子句 (在此案例中是產品 20),以產生 SQL 陳述式來傳回資料。

所產生的 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) 就會使用包含數千個產品識別碼的 WHERE ProductID IN 子句產生SQL 陳述式。所產生的陳述式可能會太大而無法由資料來源處理,因為記憶體或效能有所限制或發生問題。

解決方案是讓 QlikView改為建立子查詢,方法是將DirectEnableSubquery 設為 True。所產生的 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子句。