Share via


Otimizar consultas que utilizam expressões nomeadas

Este artigo aborda como otimizar a utilização repetida de expressões nomeadas numa consulta.

No Linguagem de Pesquisa Kusto, pode vincular nomes a expressões complexas de várias formas diferentes:

Quando referencia estas expressões nomeadas numa consulta, ocorrem os seguintes passos:

  1. O cálculo na expressão com nome é avaliado. Este cálculo produz um valor escalar ou tabular.
  2. A expressão nomeada é substituída pelo valor calculado.

Se o mesmo nome vinculado for utilizado várias vezes, o cálculo subjacente será repetido várias vezes. Quando é que isto é uma preocupação?

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

Mitigação

Para mitigar estas preocupações, pode materializar os resultados do cálculo na memória durante a consulta. Dependendo da forma como o cálculo com nome é definido, irá utilizar diferentes estratégias de materialização:

Funções tabulares

Utilize as seguintes estratégias para funções tabulares:

  • permitir instruções e parâmetros de função: utilize a função materializar( ).
  • como operador: defina o valor da hint.materialized sugestão como true.

Por exemplo, a seguinte consulta utiliza o operador de exemplo tabular não determinista:

Nota

As tabelas não são ordenadas em geral, pelo que qualquer referência de tabela numa consulta é, por definição, não determinista.

Comportamento sem utilizar a função materializar

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

Saída

x
63
92

Comportamento com a função materializar

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 deterministas podem ser forçadas a calcular exatamente uma vez ao utilizar toscalar().

Por exemplo, a seguinte consulta utiliza a função não determinista, 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