【问题标题】:Return First Row For Given Value in a Column - BigQuery返回列中给定值的第一行 - BigQuery
【发布时间】:2018-08-02 17:37:56
【问题描述】:

我有一个非常大的表,其中有一列包含每行的字符串类型的自定义 ID。对于每个 ID,该表中有 50 个属性。这保证在表中是唯一的。

我的主要任务是获取给定 ID 的行中的这 50 个属性。 当我像下面这样运行普通查询时,只扫描 100 万行需要 5 秒。

SELECT * FROM `mytable` WHERE id='123'

据我了解,BigQuery 在将行划分为不同的集群后会并行搜索匹配项。而且我相信对于给定的 ID 值,它将检查所有不同集群中的所有行。这样即使在一个分区中找到匹配项,其他集群也会继续获得其他匹配项。

但是由于 ID 列中的值在这里是唯一的,我们能否以某种方式“破坏”在其他集群上运行的作业,一旦在集群中找到匹配项并返回该行。

我希望这将加快查询运行时间。 此外,在未来,这张表会变得非常大,所以如果能做到这一点,它对我的​​目的真的很有帮助。

欢迎提出任何建议。

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    您可以使用最近介绍的Clustered Tables
    这将使您降低成本并提高性能

    请注意:目前仅分区表支持集群 - 但对clustering non-partitioned tables 的支持正在开发中

    如果你的表是分区的,你可以通过 id 对它进行集群 - 你就完成了
    如果没有 - 您可以引入“假”日期字段并通过它进行分区,以便该表可以使用集群

    同时,如果您只对给定 ID 的一行感兴趣 - 请在下方尝试

    SELECT * FROM mytable WHERE id='123' LIMIT 1
    

    【讨论】:

    • 感谢米哈伊尔的创意。会深入研究。不幸的是,SELECT * FROM mytable WHERE id='123' LIMIT 1 在这种情况下没有任何改进。
    • 是的。使用聚簇表将查询时间减少到约 2 秒,数据处理到只有几个字节,而之前它是 230MB。而且我相信即使表大小增加,它也应该提供几乎相同的性能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多