Usando subconsultas com o Direct Discovery

Se a cardinalidade do campo chave unindo a tabela for alta, ou seja, se contiver um número grande de valores distintos, uma seleção no Qlik Sense poderá gerar um comando SQL muito grande, já que a cláusula WHERE key_field IN poderá conter um número grande de valores. Nesse caso, uma solução possível é deixar o Qlik Sense criar subconsultas.

Para ilustrar isso, usamos um exemplo onde uma tabela de produtos (ProductTable) é vinculada a uma tabela de ordem de vendas (SalesOrderDetail) usando uma ID do produto (ProductID), com ambas as tabelas usadas no modo Direct Discovery.

Two linked tables.

Criamos um gráfico com OrderMonth como dimensão e Sum(Subtotal) como medida, e uma caixa de filtro para seleção do Size.

A filter box, a bar chart and a table.

Cenário 1: Baixa cardinalidade

Nesse cenário, a tabela do produto contém um baixo número de produtos distintos, 266. Se fizermos uma seleção em Size, o Direct Discovery gerará um comando SQL para retornar os dados, usando uma cláusula WHERE ProductID IN, a qual conterá as IDs do produto, fazendo correspondência com o tamanho selecionado, nesse caso, 19 produtos.

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

O SQL gerado tem a seguinte aparência:

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

Cenário 2: Usando subconsultas

Se o mesmo exemplo contiver um número alto de produtos distintos, por exemplo 20.000, a seleção de um filtro de dimensão Size, por exemplo, poderá gerar um comando SQL com uma cláusula WHERE ProductID IN contendo milhares de IDs do produto. O comando resultante pode ser muito grande para ser administrado pela fonte de dados devido a limitações ou problemas de memória ou desempenho.

A solução é deixar o Qlik Sense criar subconsultas, configurando o DirectEnableSubquery como "true". O comando SQL gerado poderá ter a seguinte aparência:

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

O tamanho da cláusula WHERE ProductID IN não depende mais do número de chaves resultante da seleção.

As seguintes limitações aplicam-se ao uso de subconsultas:

  • A sintaxe da subconsulta é invocada somente quando você selecionar dados que envolvam a filtragem de gráficos usando dados de outra tabela.
  • A quantidade de dados nas chaves é o fator determinante, não o número de chaves.
  • As subconsultas são invocadas somente se todas as tabelas envolvidas estiverem no modo Direct Discovery. Se você filtrar o gráfico usando dados de uma tabela incluída no modo de memória, uma cláusula IN será gerada.