大查询是不是为标准 SQL 执行 __TABLES_SUMMARY__
Posted
技术标签:
【中文标题】大查询是不是为标准 SQL 执行 __TABLES_SUMMARY__【英文标题】:Does big query executes __TABLES_SUMMARY__ for standard SQL大查询是否为标准 SQL 执行 __TABLES_SUMMARY__ 【发布时间】:2020-05-14 07:45:16 【问题描述】:我们在 Big Query 中有一个包含超过 500000 个表的数据集,当我们使用旧版 SQL 对该数据集运行查询时,它会引发错误
按照 Jordan Tigani 的说法,它执行 SELECT table_id FROM .TABLES_SUMMARY 以获取要查询的相关表 How do I use the TABLE_QUERY() function in BigQuery?
使用 _TABLE_SUFFIX(标准 SQL)的查询是否执行 TABLES_SUMMARY 以获取要查询的相关表?
【问题讨论】:
“它抛出一个错误” - 什么查询,什么错误? 嗨 Felipe,它抛出了以下错误原因:resourcesExceeded,消息:查询执行期间资源超出:数据集元表根据documentation TABLE_SUFFIX
是一个伪列,其中包含与表通配符匹配的值,它在StandardSQL 中是唯一可用的。同时,__TABLE_SUMMARY_
是一个元表,其中包含有关数据集中表的信息,并且在 标准 和 旧版 SQL 中可用。因此,它们有两个不同的概念。
但是,在 StandardSQL 中,您可以使用 INFORMATION_SCHEMA.TABLES
检索有关所选数据集中表的信息,类似于 __TABLE_SUMMARY_
。 Here 您可以找到使用示例及其limitations。
下面,我使用两种方法查询了一个公共数据集:
首先,使用INFORMATION_SCHEMA.TABLES
。
SELECT * FROM `bigquery-public-data.noaa_gsod.INFORMATION_SCHEMA.TABLES`
以及部分输出:
其次,使用__TABLES_SUMMARY__
。
SELECT * FROM `bigquery-public-data.noaa_gsod.__TABLES_SUMMARY__`
还有部分输出表,
如您所见,对于每种方法,输出都有一个特定的。尽管如此,两者都检索有关特定数据集中表的元数据。
注意:BigQuery 的查询有配额。此配额适用于某些情况,包括单个查询可以引用的表数,即每个查询 1000 个,here。
【讨论】:
您好 Alexandre,感谢您的回复。但它没有回答我的问题。当您使用 TABLE_QUERY 对 legacy 运行查询时,默认情况下它将执行 TABLES_SUMMARY 以获取 table_ids,然后运行实际查询。意味着额外的查询将在内部以类似方式运行,当您使用 _TABLE_SUFFIX 在标准上运行查询时,是否会运行任何额外的查询来获取 table_ids(就像您给出的 INFORMATION_SCHEMA.TABLES 一样)?? 嗨@SaiVijay,在 StandardSQL 中,INFORMATION_SCHEMA.TABLES
检索数据集中每个表的元数据。当您运行它时,您可以检查作业执行详细信息以检查作业的行为方式。此外,您还可以查看使用此方法将扫描多少数据。同时,_TABLE_SUFFIX 不会为您提供有关表的任何元数据,它只是选择/返回通配符匹配的所有表。如果你运行SELECT _TABLE_SUFFIX as suffix FROM bigquery-public-data.noaa_gsod.*
,它不会扫描任何数据,因为它是一个伪列。我回答你的问题了吗?【参考方案2】:
不,使用通配符表查询不会执行 TABLES_SUMMARY。您可以在数据集中拥有超过 500k 的表,但它确实要求与前缀模式匹配的表的数量少于 500k。对于通配符表的其他限制,您可以参考documentation。
【讨论】:
以上是关于大查询是不是为标准 SQL 执行 __TABLES_SUMMARY__的主要内容,如果未能解决你的问题,请参考以下文章