【发布时间】:2012-01-20 02:28:17
【问题描述】:
我正在尝试在 GAE 的数据存储查看器中进行一些简单的报告。使用 GQL,我只想显示记录的几个字段。这可能吗?
如何获取带有字段的实体:
f1 f2 f3 f4 f5 f6
并显示
f1 f3 f5 f6
【问题讨论】:
标签: google-app-engine gql
我正在尝试在 GAE 的数据存储查看器中进行一些简单的报告。使用 GQL,我只想显示记录的几个字段。这可能吗?
如何获取带有字段的实体:
f1 f2 f3 f4 f5 f6
并显示
f1 f3 f5 f6
【问题讨论】:
标签: google-app-engine gql
这是不可能的。来自the GQL Reference documentation:
每个 GQL 查询始终以
SELECT *或SELECT __key__开头。
以及来自数据存储概述的Differences with SQL section:
查询数据存储时,目前无法返回 只是种类属性的一个子集。 App Engine 数据存储区可以 从查询中返回整个实体或仅返回实体键。
至于为什么存在这种限制,关于 How Entities and Indexes are Stored 的文章对 Google 的 Bigtable 背后的技术方面进行了很好的深入了解,该分布式数据库系统为 App Engine 的数据存储提供支持。 (以及其他 Google 产品)
从文章中可以看出,数据存储实体存储在几个不同的 Bigtable 中。一个Entity Bigtable存储实体的全部属性,若干个Index Bigtables存储根据实体索引排序的实体键。
当我们执行查询时,基本上会发生两个步骤。第一步是针对Index Bigtables 执行我们的查询,生成一组与我们的查询匹配的实体键。第二步是使用该组键从Entity Bigtable 中获取整个实体。
因此,当您执行以SELECT __key__ 开头的查询时,数据存储区只需执行第一步并立即返回一组键。当您执行以 SELECT * 开头的查询时,数据存储区会执行这两个步骤并返回实体集。
现在,关于为什么数据存储不支持像 SELECT f1, f3, f5, f6 这样的查询,我们需要进一步了解上述第二步中发生的情况。从文章中说,在Entity Bigtable:
不是将每个实体属性存储为相应 Bigtable 行中的单独列,而是使用单个列,其中包含二进制编码的协议缓冲区,其中包含给定实体的每个属性的名称和值。
由于低级协议缓冲区将整个实体的属性存储为单个序列化数据,这意味着仅查询实体属性的子集实际上需要额外的后处理步骤过滤结果设置并仅获取查询的属性。这会导致数据存储的性能下降,这可能是 Google 目前不支持它的原因。
【讨论】: