Google bigquery 如何提高表扫描的BigQuery性能?
我有一张表,里面有大约8000万笔金融交易记录。我想找到每一笔超过1亿美元的交易。此查询大约需要3秒钟,这对我的BI工具不起作用Google bigquery 如何提高表扫描的BigQuery性能?,google-bigquery,Google Bigquery,我有一张表,里面有大约8000万笔金融交易记录。我想找到每一笔超过1亿美元的交易。此查询大约需要3秒钟,这对我的BI工具不起作用 % time bq query --nouse_cache 'select * from kc_imports.all WHERE VALUE > 100000000' 时间结果是: 0.35s user 0.10s system 15% cpu 2.899 total 有什么方法可以大大缩短完成查询的时间吗?如果是,有什么建议?谷歌云是否提供了一些地
% time bq query --nouse_cache 'select * from kc_imports.all WHERE VALUE > 100000000'
时间结果是:
0.35s user
0.10s system
15% cpu
2.899 total
有什么方法可以大大缩短完成查询的时间吗?如果是,有什么建议?谷歌云是否提供了一些地图缩减工具
在此我应该注意到,后续查询可能会有所不同,例如,我可能还想搜索500美元以下的所有交易。我可以提出一些建议,具体取决于您查询数据的方式:
- 通过将查询限制为您真正需要的列来扫描更少的数据
- 最大限度地利用缓存(不要过于频繁地更改查询表中的数据)
- 作为数据加载过程的一部分,为超过100M的事务或任何其他需要的值创建单独的表。这将限制您在查找这些交易的某些记录时BQ需要扫描的记录数)
- 避免非确定性查询,例如NOW()或TODAY(),因为它们不可缓存
- 考虑使用每日分区表[1],因为它也可以限制要扫描的数据量(如果您查找两个日期之间的事务)
- 考虑使用表装饰器[2],尤其是当您只需要查询最近的数据(即最近10分钟或最后一小时)时
- 保持查询结果<128MB,否则它也不会被缓存
[2] 让我们在一个超过50亿行的公共表上运行一些查询
SELECT *
FROM [fh-bigquery:wikipedia.pagecounts_201605]
WHERE requests>1000
SELECT SUM(requests)
FROM [fh-bigquery:wikipedia.pagecounts_201306]
SELECT SUM(requests)
FROM [fh-bigquery:wikipedia.pagecounts_201605]
此查询需要6.1秒才能运行357 GB。我们怎样才能使它更快
SELECT COUNT(*) FROM (
SELECT *
FROM [fh-bigquery:wikipedia.pagecounts_201605]
WHERE requests>1000
)
5.8s,超过38.6GB。它花费了大约相同的时间,但是当只选择一列时,它查询的数据更少(更便宜的查询)(BigQuery意识到获得此结果所需的唯一列是请求
)
1.7s,超过357GB。几乎与第一个查询相同,但添加限制后速度要快得多。为什么?由于BigQuery将任务分配给多个工作者,因此性能将受到最慢工作者的限制。如果我们将结果限制在500,BigQuery就不需要等待所有工作人员返回
这里有一个有趣的结果:问题提到扫描8000万行需要6秒钟。在本例中,我在6秒内扫描了超过50亿行。这是一个有趣的可伸缩性展示,展示了BigQuery如何处理100倍以上的数据
其他有趣的结果:
SELECT SUM(requests)
FROM [fh-bigquery:wikipedia.pagecounts_201105]
16秒,44亿行
SELECT *
FROM [fh-bigquery:wikipedia.pagecounts_201605]
WHERE requests>1000
SELECT SUM(requests)
FROM [fh-bigquery:wikipedia.pagecounts_201306]
SELECT SUM(requests)
FROM [fh-bigquery:wikipedia.pagecounts_201605]
18秒,54亿行
SELECT *
FROM [fh-bigquery:wikipedia.pagecounts_201605]
WHERE requests>1000
SELECT SUM(requests)
FROM [fh-bigquery:wikipedia.pagecounts_201306]
SELECT SUM(requests)
FROM [fh-bigquery:wikipedia.pagecounts_201605]
53亿行,51亿行
SELECT *
FROM [fh-bigquery:wikipedia.pagecounts_201605]
WHERE requests>1000
SELECT SUM(requests)
FROM [fh-bigquery:wikipedia.pagecounts_201306]
SELECT SUM(requests)
FROM [fh-bigquery:wikipedia.pagecounts_201605]
我们在这里看到了数据存储中的一些偏差-这些表彼此非常相似,但201605的数据有些不同,它给我的结果比其他所有表都慢。通常,我希望BigQuery不断优化数据的存储方式—自动地,无需执行任何操作()
根据你的实际例子,有一些想法
SELECT*
强制扫描表中的所有列!你真的需要全部吗?仅指定所需的字段/列可以显著提高性能李>
LIMIT
可以极大地提高性能李>
- 关于限制,我做不到,我需要所有的记录李>
- 因为该工具需要支持对整个数据集的任意探索
因此,您的用例使用BigQuery作为数据存储,而不是使用它的功能。您可以考虑一些其他的DB,比如索引,等等。
我只是想分享一下我对这个问题的看法如果可以的话,分享一下你的疑问。你应该展示你的疑问——否则这只是一个抽象的问题,没有实际的答案。因此,请编辑您的问题,以显示您遇到问题的代码的一部分,然后我们可以尝试帮助解决特定问题。你也可以阅读。我在下面的回答中添加了我的发现-如果你有任何工作id,团队可以分析确切的问题以及背后发生的事情。公正的评论,我道歉。一旦我看过@FelipeHoffa的回答,我就会添加我的代码。我在Youtube上的很多视频中都看到了你,所以我非常感谢你快速而彻底的回答。)方括号是什么意思?是因为SQL中不允许使用下划线吗?
不允许使用下划线<表参考中不允许使用代码>连字符
,但它是项目fh-bigquery1的一部分。我用%time bq query--nouse_cache'从kc_导入中选择值尝试了您的建议。所有这些值>100000000'
,但它对时间没有影响。2.关于限制,我做不到