Take vs. Limit vs. Top、Sort vs. Order By

Jeb*_*b50 4 azure kql azure-data-explorer

长期使用传统SQL,习惯了order bylimittop是MS自己的“限制”但更直观。

这里两个 Kusto 查询共享相同的条件和排序依据(排序,对吧?),唯一的区别是返回多少,20 与 200。结果令人惊讶:

AzureDiagnostics | where Category contains "postgresql" | take 20  | order by TimeGenerated desc
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

AzureDiagnostics | where Category contains "postgresql" | take 200  | order by TimeGenerated desc
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

顶部更一致

AzureDiagnostics | where Category contains "postgresql" | top 2  by TimeGenerated desc 
AzureDiagnostics | where Category contains "postgresql" | top 20  by TimeGenerated desc 
Run Code Online (Sandbox Code Playgroud)

更新,感谢@Yoni L,总结如下:

  1. 每个|部分的顺序都很重要。例如,|take 10 | order by x将在 AFTER 之后排序take,这是随机的。
  2. take=limit就使用而言
  3. order by=sort by
  4. top 10 by x [asc/desc]= order by x [asc/desc] | take 10excepttop # by x使用更少的内存,应该是首选。

Yon*_*i L 7

top与、 fortake和(它们是别名)不同limit,除非源数据已排序,否则不能保证返回哪些记录。

以下是等效的 - top 20 by x desc, order by x desc | take 20,但是这具有不同的语义:take 20 | order by x desc- 它仅对(最多)20 条记录进行take排序