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:
- Numa instrução let
- No operador como
- Na lista de parâmetros formais de funções definidas pelo utilizador
Quando referencia estas expressões nomeadas numa consulta, ocorrem os seguintes passos:
- O cálculo na expressão com nome é avaliado. Este cálculo produz um valor escalar ou tabular.
- 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 comotrue
.
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 |
Conteúdo relacionado
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários