Big Query 是否适应数据?
Does Big Query adapts to the data?
我们使用 BigQuery 作为系统的分析引擎,为报告准备数据。
根据我们的流程,数据的任何部分都可能发生变化,包括 2013-2015 年的历史值,因此我们每天早上在 BigQuery 中擦除并重新加载所有 tables。
我们想了解我们的方法是否会损害性能或增加数据处理成本。可能是这样,随着时间的推移,BQ“适应” table 内容,随后的查询变得更加高效。我说的不是缓存,而是 BQ 在处理查询时可能发现的一些数据重组,例如分区。
例如,大多数查询都与特定年份或值类型相关,因此一旦识别出常见的查询模式,BQ 可能希望跨这些字段对数据进行分区。
一般来说,BigQuery 会 根据查询方式重构您的 table 以提高性能。如果你每天重写你的 tables,你会错过一些性能优势,但由于你是一次加载所有数据,tables 应该是相当高效的。
您使用的机制不会增加数据处理成本。如果您对成本敏感,并且查询特定年份,您可能需要考虑将 table 分成多个 table。然后,您可以使用 TABLE_DATE_RANGE 或 TABLE_QUERY 函数查询这些 table。
乍一看,它可能看起来不相关 - 但请检查 [Table 装饰器][1]
并在 [语法部分][2]
中特别注释
您可能会注意到其中大量提及 7 天
所以,下面是我对你的问题的几分钱 - 简化视图:
当您将数据加载到 GBQ 时 - 它会保持原样 7 天,之后您的数据将在存储和访问方面进行优化。
这就是您每天重新加载所失去的。
损失有多大?根据 Jordan 的回答 - 不多,因为你满载,因此碎片可能是最小的
关于分区,我希望你不要将 2013-2016 年的所有数据存储在一个大 table。
如果您的 usage/query-pattern 是基于年份的——您最好将 tables 按年或月甚至日进行分区(取决于您的查询模式)
这将大大提高您的性能和成本效益
重要 - 截至目前,由您负责数据的分区策略,并且没有太多(如果有的话)内置功能来支持构建分区。虽然,有一些支持使用分区数据——例如 - [Table 通配符函数][3]
我希望 Google 团队会提出更好的分区支持,因为这在现实生活中的用例中变得越来越需要
[1]: https://cloud.google.com/bigquery/docs/reference/legacy-sql#tablewildcardfunctions 我希望 Google 团队会提出更好的分区支持
[2]: https://cloud.google.com/bigquery/table-decorators#snapshot-syntax
[3]: https://cloud.google.com/bigquery/docs/reference/legacy-sql#tablewildcardfunctions
我们使用 BigQuery 作为系统的分析引擎,为报告准备数据。 根据我们的流程,数据的任何部分都可能发生变化,包括 2013-2015 年的历史值,因此我们每天早上在 BigQuery 中擦除并重新加载所有 tables。
我们想了解我们的方法是否会损害性能或增加数据处理成本。可能是这样,随着时间的推移,BQ“适应” table 内容,随后的查询变得更加高效。我说的不是缓存,而是 BQ 在处理查询时可能发现的一些数据重组,例如分区。
例如,大多数查询都与特定年份或值类型相关,因此一旦识别出常见的查询模式,BQ 可能希望跨这些字段对数据进行分区。
一般来说,BigQuery 会 根据查询方式重构您的 table 以提高性能。如果你每天重写你的 tables,你会错过一些性能优势,但由于你是一次加载所有数据,tables 应该是相当高效的。
您使用的机制不会增加数据处理成本。如果您对成本敏感,并且查询特定年份,您可能需要考虑将 table 分成多个 table。然后,您可以使用 TABLE_DATE_RANGE 或 TABLE_QUERY 函数查询这些 table。
乍一看,它可能看起来不相关 - 但请检查 [Table 装饰器][1]
并在 [语法部分][2]
中特别注释
您可能会注意到其中大量提及 7 天
所以,下面是我对你的问题的几分钱 - 简化视图:
当您将数据加载到 GBQ 时 - 它会保持原样 7 天,之后您的数据将在存储和访问方面进行优化。
这就是您每天重新加载所失去的。
损失有多大?根据 Jordan 的回答 - 不多,因为你满载,因此碎片可能是最小的
关于分区,我希望你不要将 2013-2016 年的所有数据存储在一个大 table。
如果您的 usage/query-pattern 是基于年份的——您最好将 tables 按年或月甚至日进行分区(取决于您的查询模式)
这将大大提高您的性能和成本效益
重要 - 截至目前,由您负责数据的分区策略,并且没有太多(如果有的话)内置功能来支持构建分区。虽然,有一些支持使用分区数据——例如 - [Table 通配符函数][3]
我希望 Google 团队会提出更好的分区支持,因为这在现实生活中的用例中变得越来越需要
[1]: https://cloud.google.com/bigquery/docs/reference/legacy-sql#tablewildcardfunctions 我希望 Google 团队会提出更好的分区支持 [2]: https://cloud.google.com/bigquery/table-decorators#snapshot-syntax [3]: https://cloud.google.com/bigquery/docs/reference/legacy-sql#tablewildcardfunctions