名前付き式を使用するクエリを最適化する

この記事では、クエリでの名前付き式の繰り返し使用を最適化する方法について説明します。

Kusto 照会言語では、いくつかの異なる方法で複雑な式に名前をバインドできます。

クエリでこれらの名前付き式を参照すると、次の手順が実行されます。

  1. 名前付き式内の計算が評価されます。 この計算では、スカラーまたは表形式の値が生成されます。
  2. 名前付き式は、計算値に置き換えられます。

同じバインド名を複数回使用すると、基になる計算が複数回繰り返されます。 これはどのようなときに問題になるでしょうか。

  • 計算で多くのリソースが消費され、何度も使用されるとき。
  • 計算が決定論的ではないが、すべての呼び出しが同じ値を返すと見なされるとき。

対応策

これらの問題を軽減するために、クエリ中に計算結果をメモリ内で具体化できます。 名前付き計算の定義方法に応じて、異なる具体化方法を使用します。

表形式関数

表形式関数には、次の方法を使用します。

  • let ステートメントと関数パラメーター: materialize() 関数を使用します。
  • as 演算子: hint.materialized ヒントの値を true に設定します。

たとえば、次のクエリでは、非決定的な表形式のサンプル演算子を使用します。

注意

テーブルは通常並べ替えられていないため、クエリ内のテーブル参照は定義上、非決定的です。

materialize 関数を使用しない動作

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

出力

x
63
92

materialize 関数を使用する動作

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

出力

x
95
95

スカラー関数

非決定論的スカラー関数は、toscalar() を使用して厳密に 1 回のみ計算を強制できます。

たとえば、次のクエリでは、非決定論的関数 rand() を使用します。

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

出力

print_0 print_1 print_2 print_3
166 137 70 70