Direct Discovery でのサブクエリの使用

テーブルを結合するキー項目の濃度が高い場合、つまり、キー項目が多くのユニーク値を含む場合、Qlik Sense での選択によっては、WHERE key_field IN 節に多くの値が含まれることがあるため、非常に大きな SQL ステートメントが生成される可能性があります。この場合、Qlik Sense がサブクエリを作成するようにして問題を解決することができます。

説明のために、商品テーブル (ProductTable) が販売注文テーブル (SalesOrderDetail) に商品 ID (ProductID) を使用してリンクされており、両方のテーブルが Direct Discovery モードで使用されている例を利用します。

Two linked tables.

OrderMonth が軸、Sum(Subtotal) がメジャーで、フィルター ボックスで Size を選択できるチャートを作成します。

A filter box, a bar chart and a table.

シナリオ 1: 低濃度

このシナリオでは、商品テーブルには、266 のユニークな商品が含まれ、その数は多くはありません。Size で選択を行うと、Direct Discovery が、選択されたサイズと一致する商品 ID (この場合は、19 商品) を含む 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 節が生成されます。