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

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

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

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

シナリオ 1: 低濃度

このシナリオでは、商品テーブルには、266 のユニークな商品が含まれ、その数は多くはありません。Sizeで選択を行うと、Direct Discovery が、選択されたサイズと一致する商品 ID (この場合は、20 商品) を含む WHERE ProductID IN を使用して、データを返す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を選択したとすると、何千もの商品 ID が含まれる WHERE ProductID IN 節を持つSQL ステートメントが生成されることになります。その結果、ステートメントが大きすぎて、メモリやパフォーマンスの制限または問題で、データ ソースでステートメントを処理できなくなる場合もあります。

これを解決するには、DirectEnableSubqueryを true に設定して、QlikView でサブクエリが作成されるようにします。生成される 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節が生成されます。