首页 > 解决方案 > 当我们使用 Limit 时是否有任何性能优势

问题描述

例如

    SELECT company_ID, totalRevenue 
FROM `BigQuery.BQdataset.companyperformance` 
ORDER BY totalRevenue LIMIT 10

我可以看到使用和不使用 LIMIT 10 之间的唯一区别只是用于向用户显示的数据量不同。在执行 LIMIT 之前,系统仍然首先对所有数据进行排序。

标签: google-bigquerydatabase-performance

解决方案


以下适用于 BigQuery

不一定 100% 技术上正确 - 但足够接近,所以我希望下面能让您了解为什么 LIMIT N 在 BigQuery 中非常重要

假设您有 1,000,000 行数据和 8 个工作人员来处理如下查询

SELECT * FROM table_with_1000000_rows ORDER BY some_field

第 1 轮:要对这些数据进行排序,每个工人得到 125,000 行 - 所以现在您有 8 个已排序的集合,每个 125,000 行
第 2 轮:工人 #1 将其排序数据(125,000 行)发送给工人 #2,#3 发送到 #4,然后很快。所以现在我们有 4 个工人,每个工人生产 250,000 行的有序集
第 3 轮:重复上述逻辑,现在我们只有 2 个工人,每个工人生产 500,000 行的有序列表
第 4 轮:最后,只有一个工人生产 1,000,000 行的最终有序集

当然,根据行数和可用工人的数量 - 轮数可能与上述示例不同

总结:我们在这里拥有什么
:我们有相当大量的数据在工作人员之间传输——这可能是性能下降的一个相当大的因素
b. 我们有机会让其中一名工人无法处理分配给各个工人的数据量。它可能更早或更晚发生,通常表现为“资源超出……”类型的错误

因此,现在如果您将 LIMIT 作为查询的一部分,如下所示

SELECT * FROM table_with_1000000_rows ORDER BY some_field LIMIT 10 

所以,现在 - 第一轮将是一样的。但是从第 2 轮开始——只有前 10 行将被发送给另一个工人——因此在第一轮之后的每一轮中——只有 20 行将被处理,只有前 10 行将被发送以进行进一步处理希望你看到这两个过程在术语上有多么不同工作人员之间发送的数据量以及每个工作人员需要申请多少工作才能对各自的数据进行排序

总结:
没有 LIMIT 10:
• 移动的初始行(第 1 轮):1,000,000;
• 排序的初始行(第 1 轮):1,000,000;
• 移动的中间行(第 2 - 4 轮):1,500,000
• 总体合并的有序行(第 2 - 4 轮):1,500,000;
• 最终结果:1,000,000 行

使用 LIMIT 10:
• 移动的初始行(第 1 轮):1,000,000;
• 排序的初始行(第 1 轮):1,000,000;
• 移动的中间行(第 2 - 4 轮):70
• 整体合并的有序行(第 2 - 4 轮):140;
• 最终结果:10 行

希望上面的数字清楚地显示您使用 LIMIT N 获得的性能差异,在某些情况下甚至能够成功运行查询而不会出现“资源超出...”错误


推荐阅读