google-bigquery - BigQuery:查询按摄取时间分区的表的成本与分区的日期/时间戳
问题描述
我们正在尝试基于 BigQuery 在云中构建(或者说重建)我们的 DWH。我们决定对原始数据使用“按日期字段分区”表(如“created_date”字段)而不是摄取时间分区,因为使用此功能,我们可以轻松加载数据,然后使用“分组依据”分区日期列查询它,建立数据集市bla bla bla。我们认为这种分区方法将提高查询速度并降低其成本(与非分区表相比 - 是的),但我们发现比使用 WHERE 按分区字段查询表时(如 'select count(*) from table where created_date=current_date'),它会花钱。
我们使用 WHERE _PARTITIONTIME ='' 的旧式摄取时间分区表查询是免费的!(比如'从_PARTITIONTIME=current_date'的表中选择计数(*))
例如:
1) 从 table1 中选择 value1,其中 _PARTITIONTIME = current_date
2) 从 table1 中选择 value1,其中 created_date = current_date
3) 从 table1 中选择 count(*),其中 _PARTITIONTIME = current_date
第二个查询成本更高,因为它将扫描 2 列。它的逻辑。但不公平(((第三个查询是绝对免费的顺便说一句!
这是非常可悲的情况,因为文档中没有关于这种“副作用”的任何警告。此功能旨在使 DB 开发人员的生活更轻松(我猜),它被定位为最佳实践功能并被 Google 强烈推荐。但是没有人说这也会花费你额外的钱!
所以问题是我们能否以某种方式免费使用分区键查询日期字段分区表?如果您使用基于日期/时间戳字段的分区,是否还有其他可用的伪列或按分区键过滤的方法?
(ps:如果日期/时间戳分区方法不存在,你们谷歌必须添加一些伪列)。
谢谢!
解决方案
所以问题是我们能否以某种方式免费使用分区键查询日期字段分区表?
答案是否定的,查询分区不会是免费的。
如果您使用基于日期/时间戳字段的分区,是否还有其他可用的伪列或按分区键过滤的方法?
如果您想按日期进行分区,这只能使用带有 _PARTITIONTIME 伪列的摄取时间分区或在选定的日期/时间戳值列中使用日期值来实现。目前没有可用的替代选项。请记住,分区的主要目标之一是主要通过减少扫描的行数来减少扫描的数据量。
如果日期/时间戳分区方法不存在,谷歌的你们必须添加一些伪列
我了解您希望为数据列分区方法提供一些伪列,但是您能否在原始帖子中详细说明您希望在此分区中看到哪些值?
编辑:已代表您打开功能请求。你可以在这里关注
推荐阅读
- java - 映射和数组列表,如果索引为 getEntry() 为 null,则添加“0”
- sql - 如何在 BIG QUERY 中仅选择增量记录
- .net-core - JWT 令牌在 dotnet core 2.1 中返回失败
- angular - Firebase / Recaptcha / Ionic / Angular - 无法分配给对象'[object Object]'的只读属性'taskData'
- sql-server - 如何过滤嵌套查询中的记录,然后从过滤结果中选择同一表中的其他列?
- android - 如何为 RTL 支持应用程序提供 topLeftRadius?
- sql - 表 SQL 每一行都有空格
- regex - 捕获组的开始是否有类似于惰性/贪婪/姿势的概念?
- c++ - 具有交替类型的参数包
- c - Eclipse 将项目重构为可执行文件和库