为什么实体查询明显慢于Breeze中的预测?

时间:2014-05-01 17:41:34

标签: .net entity-framework angularjs odata breeze

我有一个WebAPI2 / OData Breeze服务器(.NET 4.5,EntityFramework 6),我正在从Breeze / AngularJS客户端查询。我希望运行一个完整的实体查询比运行一个投影慢,但我预计它会与穿过电线的数据量成比例。但是,如果我运行像:

这样的投影
var query = breeze.EntityQuery.from('Users')
    .where('firstName', 'startsWith', 'K')
    .select('firstName');

return manager
    .executeQuery(query)
    .then(querySucceeded, _queryFailed);

我得到45KB的数据,请求需要15ms。 (发布模式)

我运行完整的实体查询,如:

var query = breeze.EntityQuery.from('Users')
    .where('firstName', 'startsWith', 'K');

return manager
    .executeQuery(query)
    .then(querySucceeded, _queryFailed);

我获得159KB的数据,请求需要154ms。 (发布模式)

这使得实体查询返回大约3倍的数据,但需要花费10倍的时间。如果我在调试模式下运行,则差异更加明显。然后投影需要39毫秒,但完整的实体查询需要一个完整的8120毫秒(!),这使得调试有点痛苦。因此,在调试模式下,完整实体查询实际上比投影花费的时间长200倍。

为什么完整的实体查询会花费不成比例的时间,特别是在调试模式下?这是正常的,还是这表明某些问题?

1 个答案:

答案 0 :(得分:1)

投影查询可以比“实体”快得多。在Breeze中的查询,因为通常不需要将投影的结果合并到EntityManager缓存中,如果你有很多实体,这是一个耗时的过程。 (如果投影本身包含实体,那么请注意这里。)

如果你不需要这种能力,或者只是想在某些时候Breeze有一个' noTracking'您可以在查询上调用的方法。 (请参阅:此页面上的' noTracking'部分:http://www.breezejs.com/documentation/querying-depth)。没有跟踪查询,尤其是涉及大量实体的跟踪查询将更快。

就调试与发布性能而言,这可能纯粹是一个服务器端'问题和我的经验主要是Visual Studio工件。

请注意,如果您的大多数工作只是客户端,那么javascript可以让您的服务器在“发布”中的单独解决方案中运行。模式,只需启动一次并让它继续运行。在客户端开发过程中进行迭代要快得多。