我在本地分析我的應用程序(使用Dev服務器)以獲取有關GAE如何工作的更多信息。我的測試是比較常見的完整實體查詢和投影查詢。在我的測試中,兩個查詢都執行相同的查詢,但投影是用2個屬性指定的。測試種類有100個屬性,每個實體的值都相同,共有10個實體。數據存儲區查看器和Appstats生成的數據的圖像如下所示。在Appstats映像中,請求4是一個內存緩存刷新,請求3是測試數據庫創建(它已經創建,因此沒有成本),請求2是完整的實體查詢,請求1是投影查詢。如何使Appstats顯示小操作和讀操作?
我很驚訝,這兩個查詢產生了相同數量的讀取。我的猜測是,小型和讀取操作和報告相同的Appstats。如果是這種情況,我想在報告中將它們分開。這是查詢相關功能:
// Full Entity Query
public ReturnCodes doQuery() {
DatastoreService dataStore = DatastoreServiceFactory.getDatastoreService();
for(int i = 0; i < numIters; ++i) {
Filter filter = new FilterPredicate(DBCreation.PROPERTY_NAME_PREFIX + i,
FilterOperator.NOT_EQUAL, i);
Query query = new Query(DBCreation.ENTITY_NAME).setFilter(filter);
PreparedQuery prepQuery = dataStore.prepare(query);
Iterable<Entity> results = prepQuery.asIterable();
for(Entity result : results) {
log.info(result.toString());
}
}
return ReturnCodes.SUCCESS;
}
// Projection Query
public ReturnCodes doQuery() {
DatastoreService dataStore = DatastoreServiceFactory.getDatastoreService();
for(int i = 0; i < numIters; ++i) {
String projectionPropName = DBCreation.PROPERTY_NAME_PREFIX + i;
Filter filter = new FilterPredicate(DBCreation.PROPERTY_NAME_PREFIX + i,
FilterOperator.NOT_EQUAL, i);
Query query = new Query(DBCreation.ENTITY_NAME).setFilter(filter);
query.addProjection(new PropertyProjection(DBCreation.PROPERTY_NAME_PREFIX + 0, Integer.class));
query.addProjection(new PropertyProjection(DBCreation.PROPERTY_NAME_PREFIX + 1, Integer.class));
PreparedQuery prepQuery = dataStore.prepare(query);
Iterable<Entity> results = prepQuery.asIterable();
for(Entity result : results) {
log.info(result.toString());
}
}
return ReturnCodes.SUCCESS;
}
任何想法?
編輯:爲了更好地瞭解問題,我創建了另一個測試,它執行相同的查詢,但只使用鍵查詢。對於這種情況,Appstats在報告中正確顯示DATASTORE_SMALL操作。我仍然對投影查詢的行爲感到困惑,它也應該報告DATASTORE_SMALL操作。請幫忙!