google-bigquery - 当我们使用 Limit 时是否有任何性能优势
问题描述
例如
SELECT company_ID, totalRevenue
FROM `BigQuery.BQdataset.companyperformance`
ORDER BY totalRevenue LIMIT 10
我可以看到使用和不使用 LIMIT 10 之间的唯一区别只是用于向用户显示的数据量不同。在执行 LIMIT 之前,系统仍然首先对所有数据进行排序。
解决方案
以下适用于 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 获得的性能差异,在某些情况下甚至能够成功运行查询而不会出现“资源超出...”错误
推荐阅读
- sql - 循环 ER 表的 CREATE TABLE 语句
- javascript - 在选定的上下文菜单中访问节点详细信息 - D3
- c++ - 如何渲染 QQuickItem 孩子?
- python - 如果列表的值具有堆栈中的特定项目,如何打印和删除键
- javascript - Laravel Vue Axios 未定义
- c# - IronPython 2.7.8 编码 (ASCII) 与 Python 的 3.7 (UTF-8)
- image-processing - 将图像颜色空间从 RGB 转换为对手颜色
- excel - Excel VBA 遍历数据验证列表并将范围从工作表复制到新工作表
- python - 在 keras model.predict 中获取所有相同的值
- winapi - Get DLL Module size after DLL injection without GetModuleInformation