Google bigquery 如何提高表扫描的BigQuery性能?

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 有什么方法可以大大缩短完成查询的时间吗?如果是,有什么建议?谷歌云是否提供了一些地

我有一张表,里面有大约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
有什么方法可以大大缩短完成查询的时间吗?如果是,有什么建议?谷歌云是否提供了一些地图缩减工具


在此我应该注意到,后续查询可能会有所不同,例如,我可能还想搜索500美元以下的所有交易。

我可以提出一些建议,具体取决于您查询数据的方式:

  • 通过将查询限制为您真正需要的列来扫描更少的数据

  • 最大限度地利用缓存(不要过于频繁地更改查询表中的数据)

  • 作为数据加载过程的一部分,为超过100M的事务或任何其他需要的值创建单独的表。这将限制您在查找这些交易的某些记录时BQ需要扫描的记录数)

  • 避免非确定性查询,例如NOW()或TODAY(),因为它们不可缓存

  • 考虑使用每日分区表[1],因为它也可以限制要扫描的数据量(如果您查找两个日期之间的事务)

  • 考虑使用表装饰器[2],尤其是当您只需要查询最近的数据(即最近10分钟或最后一小时)时

  • >P>如果使用ReGExpExtMatH(),则考虑使用Cube(),如果可能的话,

  • 保持查询结果<128MB,否则它也不会被缓存

最后,BigQuery的真正威力告诉我们,当您的数据增长时,您的查询时间将增加,但规模要小得多。然而,BigQuery确实拥有非常大的数据集,但它不是一个实时查询引擎——它是一个分析数据库。如果您需要1秒或亚秒级的响应,则需要在BigQuery上添加额外的缓存层

[1]


[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
    可以极大地提高性能
  • 终于!您在BI工具中实际做了什么? 很可能是某种聚合/统计/等等。 为什么不在这里实现逻辑并输出结果呢。 大容量事务性原始数据本身的输出非常耗时,而小容量聚合数据的输出速度很快
    • 关于限制,我做不到,我需要所有的记录
    • 因为该工具需要支持对整个数据集的任意探索
    您的特定用例的主要问题是它不是BigQuery的用途

    GoogleBigQuery是一种web服务,可以让您进行交互式分析 海量数据集的数据量高达数十亿行。可扩展且易于使用, BigQuery让开发人员和企业能够利用强大的数据 按需分析

    BigQuery本身就是一个对海量数据集进行交互式分析的工具
    因此,您的用例使用BigQuery作为数据存储,而不是使用它的功能。您可以考虑一些其他的DB,比如索引,等等。
    我只是想分享一下我对这个问题的看法

    如果可以的话,分享一下你的疑问。你应该展示你的疑问——否则这只是一个抽象的问题,没有实际的答案。因此,请编辑您的问题,以显示您遇到问题的代码的一部分,然后我们可以尝试帮助解决特定问题。你也可以阅读。我在下面的回答中添加了我的发现-如果你有任何工作id,团队可以分析确切的问题以及背后发生的事情。公正的评论,我道歉。一旦我看过@FelipeHoffa的回答,我就会添加我的代码。我在Youtube上的很多视频中都看到了你,所以我非常感谢你快速而彻底的回答。)方括号是什么意思?是因为SQL中不允许使用下划线吗?
    不允许使用下划线<表参考中不允许使用代码>连字符
    ,但它是项目fh-bigquery1的一部分。我用
    %time bq query--nouse_cache'从kc_导入中选择值尝试了您的建议。所有这些值>100000000'
    ,但它对时间没有影响。2.关于限制,我做不到