Otimizar as consultas que usam expressões nomeadas

Este artigo aborda como otimizar o uso repetido de expressões nomeadas em uma consulta.

Na Linguagem de Consulta Kusto, você pode associar nomes a expressões complexas de várias maneiras diferentes:

Quando você referencia essas expressões nomeadas em uma consulta, as seguintes etapas ocorrem:

  1. O cálculo dentro da expressão nomeada é avaliado. Esse cálculo produz um valor escalar ou de tabela.
  2. A expressão nomeada é substituída pelo valor calculado.

Se o mesmo nome associado for usado várias vezes, o cálculo subjacente será repetido várias vezes. Quando isso é uma preocupação?

  • Quando os cálculos consomem muitos recursos e são usados muitas vezes.
  • Quando o cálculo não é determinístico, mas a consulta pressupõe que todas as invocações retornem o mesmo valor.

Atenuação

Para atenuar essas preocupações, você pode materializar os resultados do cálculo na memória durante a consulta. Dependendo da forma como o cálculo nomeado é definido, você usará diferentes estratégias de materialização:

Funções tabulares

Use as seguintes estratégias para as funções de tabela:

  • instruções let e parâmetros de função: use a função materialize().
  • Operador as: defina o valor da dica hint.materialized como true.

Por exemplo, a seguinte consulta usa o operador sample de tabela não determinístico:

Observação

As tabelas não são classificadas em geral. Portanto, qualquer referência de tabela em uma consulta é, por definição, não determinística.

Comportamento sem o uso da função materialize

range x from 1 to 100 step 1
| sample 1
| as T
| union T

Saída

x
63
92

Comportamento com o uso da função materialize

range x from 1 to 100 step 1
| sample 1
| as hint.materialized=true T
| union T

Saída

x
95
95

Funções escalares

As funções escalares não determinísticas podem ser forçadas a calcular exatamente uma vez usando toscalar().

Por exemplo, a seguinte consulta usa a função não determinística rand():

let x = () {rand(1000)};
let y = () {toscalar(rand(1000))};
print x, x, y, y

Saída

print_0 print_1 print_2 print_3
166 137 70 70