2016-07-26 74 views
0

我有一个表,我想返回某个列的最频繁的值。通常,使用经典的GROUP BY ... ORDER BY ... LIMIT可以做到这一点。我偶然发现了BigQuery的TOP函数,我对它感兴趣,因为文档声明它通常更快。但是,该文件还说,它“可能只返回近似结果”。什么时候会发生这种情况?当需要准确的结果时,通常使用TOP函数是否值得?从documentationGoogle BigQuery的TOP函数何时会返回近似结果?

全面介绍:

TOP是一个函数,是 替代GROUP BY子句。它用作GROUP BY ... ORDER BY ... LIMIT ....的简化语法 通常,TOP功能 的执行速度快于完整查询的... GROUP BY ... ORDER BY ... LIMIT ... ,但可能只返回近似结果。

+0

重要的是,您可以使用投票下方发布的答案左侧的勾号标记接受的答案。请参阅http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work#5235了解其重要性。答案投票也很重要。表决有用的答案。还有更多......当某人回答你的问题时,你可以查看该怎么做 - http://stackoverflow.com/help/someone-answers。 –

+0

我知道这样做的做法,但你的回答并不直接解决我问的问题,因此我不能接受它。我很欣赏你的时间,所以它确实值得赞赏。 –

回答

1

下面可能更适合评论 - 但过于冗长,所以我把它改成答案

到目前为止,从我的经验是刚刚好,以具有简化的替代GROUP BY - 也就是说,顺便说一句,仅适用于简单情况:A query that uses the TOP() function can return only two fields: the TOP field, and the COUNT(*) value.

这就是说 - 我没有看到计数差异,但我确实看到它运行得更快。
因此,检查下面的比较,我用2.5B行对表进行运行。正如你所看到的 - 数完全相同和运行时间快15%

enter image description here

enter image description here

同时,如果你将运行类似的查询和检查Query Plan Explanation - 你会看到完全不同的执行模式可能会导致不同的结果,但我无法捕捉到这种用例

+1

只有5个不同的元素,保持运行计数很容易:您只需要5个计数器。拥有1,000,000个不同的元素,你需要足够的内存来存储一百万个不同的计数器TOP()能够以降低内存的方式向您展示顶级元素,并以给出近似结果为代价。这就是为什么TOP速度更快,为什么你在这里得到确切的结果:)。 –

+0

有道理!谢谢Felipe! –