BigQuery 通配符表 - 有啥限制?

Posted

技术标签:

【中文标题】BigQuery 通配符表 - 有啥限制?【英文标题】:BigQuery wildcard tables - what are the limits?BigQuery 通配符表 - 有什么限制? 【发布时间】:2020-01-30 20:14:49 【问题描述】:

我正在考虑组织一个包含多个表的 BigQuery 数据集,我可以使用通配符进行查询。

在此用例中,可能会有 1000 多个表,每个表代表不同的客户。我需要能够单独查询它们,并且我还需要同时查询它们。

我正在考虑使用多个表而不是单个表进行集群,因为在仅为特定客户运行查询时,我希望能够只扫描我需要的数据。

Quotas and limits 页面列出了以下看起来适用的限制:

每个查询引用的最大表数 - 1,000 已解决的旧版和标准 SQL 查询的最大长度 - 12 MB 解析查询长度的限制包括查询引用的所有视图和通配符表的长度。

我的问题是:

1) 使用通配符(例如 SELECT * FROM `project_id.dataset_id.table_*`)运行查询时,是否所有与通配符匹配的单个表都计入此 1000 个表的限制?

2) 12 MB 的限制究竟计算了什么?例如,假设我有以下表格project_id.dataset_id.table_1project_id.dataset_id.table_2project_id.dataset_id.table_3

如果我在table_* 上运行SELECT,解析后的查询长度是多少?是否包含所有表的完全限定名(project_id.dataset_id.table_1project_id.dataset_id.table_2project_id.dataset_id.table_3)? 如果我使用通配符 table_* 但在 _TABLE_SUFFIX 上包含一个过滤器(例如,WHERE _TABLE_SUFFIX = "1"),这是否会从已解析的查询中消除与过滤器不匹配的表?

3) 是否还有其他需要注意的限制?

提前谢谢你。

【问题讨论】:

【参考方案1】:

我的建议是反对。您将很快达到 1000 个表,而且您无法全部查询它们。另一个是单独拥有每个表将无法维护。

您可以使用集群来帮助您。 如果您的一列是tenant_id,那么您可以在集群中使用它。

【讨论】:

谢谢,我正在考虑按时使用分区 + 在客户 ID 字段上进行集群。我对集群的担忧是,似乎无法预测数据增长时的效率,并且有许多数据量非常不同的客户端。有什么方法可以预测扫描的数量? 阅读“dryrun”概念,这可能有助于获得一些预测。 谢谢。不幸的是,对于聚簇表,空运行似乎只显示一个上限(与没有聚簇相同的值)。在这个用例中,我希望能够估计为单个客户检索数据的成本,以便根据客户的数据量为客户提供数据的成本是众所周知的。 我建议您提出Feature Request 询问此功能并投票并提供有关它如何有用的反馈。【参考方案2】:

使用通配符运行查询时,是否所有与通配符匹配的单个表都计入此 1000 个表的限制?

所有匹配通配符和 _TABLE_SUFFIX 过滤器的表都将计入 1000 限制

在 12 MB 的限制中究竟计算了什么?

根据上述 1000 个表限制计算的所有表的完全限定名称的长度将计入 12 MB 限制

还有其他我应该注意的限制吗?

建议 - 分区和集群的组合将在您在问题中描述的用例中为您提供更好的服务。尤其是现在您可以按integer range进行分区了 这将为您在维护和处理数据方面提供卓越的灵活性,以便与分片表方法进行比较 显然,还有limitations related to partitioned tables可以考虑

【讨论】:

谢谢,我正在考虑按时使用分区 + 在客户 ID 字段上进行集群。我对集群的担忧是,似乎没有办法预测数据增长时的效率,并且有许多数据量非常不同的客户端。有什么方法可以预测扫描的数量?

以上是关于BigQuery 通配符表 - 有啥限制?的主要内容,如果未能解决你的问题,请参考以下文章

带有日期列的 BigQuery 标准 SQL 表通配符

在 BigQuery 中将数据插入/创建分片/通配符表

尚不支持 BigQuery、非分区表上的通配符表和基于字段的分区表

BigQuery 中是不是有与标准 SQL 等效的表通配符函数?

bigquery 通配符表查询不允许选择某些字段

从 BigQuery 中的最新表分区通配符查询