为什么Orchard在执行内容项查询时这么慢?

时间:2016-02-19 08:16:06

标签: sql performance orchardcms

假设我想查询所有Orchard用户ID,并且我想要包括那些已被删除(也称为软删除)的用户。数据库包含大约1000个用户。

选项A - 大约需要2分钟

View.OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
    CustomViewHolder holder = (CustomViewHolder) view.getTag();
    int position = holder.getPosition();

    FeedItem feedItem = feedItemList.get(position);
    Toast.makeText(mContext, feedItem.getTitle(), Toast.LENGTH_SHORT).show();
}};

选项B - 以几乎无法察觉的延迟执行

Orchard.ContentManagement.IContentManager lContentManager = ...;

lContentManager
  .Query<Orchard.Users.Models.UserPart, Orchard.Users.Models.UserPartRecord>(Orchard.ContentManagement.VersionOptions.AllVersions)
  .List()
  .Select(u => u.Id)
  .ToList();

使用选项A时,我没有看到在SQL事件探查器中执行任何SQL查询。我想这与NHibernate或缓存有关。

有没有办法优化选项A

1 个答案:

答案 0 :(得分:2)

可能是因为IContentManager版本正在通过InfoSet访问数据(基本上是数据的xml表示),其中IRepository版本使用实际的数据库表本身。

我似乎记得读过虽然Infoset在许多情况下都很棒,但是当你处理带有排序/过滤的更大数据集时,直接使用表更有效率,因为使用Infoset需要解析每个xml片段在获取数据之前提取的元素。

自“转变”以来,Orchard使用两者,因此您可以使用最适合您需求的方法。我找不到现在解释它的文章,但这解释了这个转变&amp; infosets非常好:

http://weblogs.asp.net/bleroy/the-shift-how-orchard-painlessly-shifted-to-document-storage-and-how-it-ll-affect-you

希望对你有帮助吗?