我正在嘗試在GAE中的數據存儲查看器中執行一些簡單的報告。使用GQL我只想顯示記錄的幾個字段。這可能嗎?數據查看器中的限制字段
如何採取實體領域:
F1 F2 F3 F4 F5 F6
,並顯示
F1 F3 F5 F6
我正在嘗試在GAE中的數據存儲查看器中執行一些簡單的報告。使用GQL我只想顯示記錄的幾個字段。這可能嗎?數據查看器中的限制字段
如何採取實體領域:
F1 F2 F3 F4 F5 F6
,並顯示
F1 F3 F5 F6
這是不可能的。從the GQL Reference documentation:
每個GQL查詢總是以任何
SELECT *
或SELECT __key__
。
而且從數據存儲概述的Differences with SQL section:
當查詢的數據存儲,它是當前無法返回 只有一種屬性的子集。 App Engine數據存儲可以從或者 返回整個實體或者僅返回查詢中的實體鍵。
至於爲什麼這種限制的存在,文章關於How Entities and Indexes are Stored了關於落後於谷歌的Bigtable,分佈式數據庫系統供電App Engine的數據存儲技術方面的一個很好的洞察力。 (和其他Google產品)
從文章中,數據存儲實體存儲在幾個不同的Bigtables中。一個Entity Bigtable
存儲實體的全部屬性,並且幾個Index Bigtables
存儲根據實體的索引排序的實體密鑰。
當我們執行查詢時,基本上有兩步發生。第一步是我們的查詢正在針對Index Bigtables
執行,產生一組與我們的查詢匹配的實體關鍵字。第二步是使用這組密鑰從Entity Bigtable
中獲取整個實體。
因此,當您執行從SELECT __key__
開始的查詢時,數據存儲只需要執行第一步並立即返回該組鍵。當您從SELECT *
開始執行查詢時,數據存儲執行了兩個步驟並返回一組實體。
現在,爲什麼數據存儲不支持像SELECT f1, f3, f5, f6
這樣的查詢,我們需要詳細研究上述第二步中發生的事情。從文章中,陳述,關於Entity Bigtable
:
相反每個實體屬性存儲爲相應的Bigtable行中的各個列的,一個單一的塔用於包含含有名稱的二進制編碼協議緩衝以及給定實體的每個屬性的值。
由於低級協議緩衝器存儲整個實體的屬性作爲單個串行化的數據,這意味着查詢僅實體的屬性的子集實際上將採取過濾結果集的額外的後處理步驟和只考慮查詢的屬性。這會導致數據存儲的性能下降,並且可能是目前Google不支持的原因。
任何想法,爲什麼這是? – Lumpy
編輯答案與我的理解爲什麼目前不支持:) –