2

我在本地分析我的應用程序(使用Dev服務器)以獲取有關GAE如何工作的更多信息。我的測試是比較常見的完整實體查詢和投影查詢。在我的測試中,兩個查詢都執行相同的查詢,但投影是用2個屬性指定的。測試種類有100個屬性,每個實體的值都相同,共有10個實體。數據存儲區查看器和Appstats生成的數據的圖像如下所示。在Appstats映像中,請求4是一個內存緩存刷新,請求3是測試數據庫創建(它已經創建,因此沒有成本),請求2是完整的實體查詢,請求1是投影查詢。如何使Appstats顯示小操作和讀操作?

enter image description here

Test statistics.

我很驚訝,這兩個查詢產生了相同數量的讀取。我的猜測是,小型和讀取操作和報告相同的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操作。請幫忙!

回答

1

[我寫Appstats會的旅途端口,所以這是基於我的經驗和回憶。]

我的猜測是,這是在將Appstats一個錯誤,這是一個相對沒有維護程序。投影查詢是新的,所以appstats可能不知道它們,並將它們視爲正常的讀取查詢。

對於一些背景,計算成本很困難。對於寫操作,成本與結果一起返回,因爲應用程序無法知道發生了什麼變化(哪些是寫入成本發生的地方)。然而,對於讀取和小型操作,有一個formula來計算成本。每個appstats實現(python,java,go)都必須實現此計算,包括反射或通過請求對象需要的任何內容來確定發生了什麼。這樣做的API並不是完全明顯的,並且有很多小的事情,所以很容易弄錯它,並且很惱火地把它做好。