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:
- Em uma instrução let
- No operador as
- Na lista de parâmetros formais de funções definidas pelo usuário
Quando você referencia essas expressões nomeadas em uma consulta, as seguintes etapas ocorrem:
- O cálculo dentro da expressão nomeada é avaliado. Esse cálculo produz um valor escalar ou de tabela.
- 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
comotrue
.
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 |
Conteúdo relacionado
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de