Sql 为什么Orchard在执行内容项查询时速度如此缓慢?
假设我想要查询所有Orchard用户ID,并且我想要包括那些已经被删除(又称软删除)的用户。数据库包含大约1000个用户 选项A-大约需要2分钟Sql 为什么Orchard在执行内容项查询时速度如此缓慢?,sql,performance,orchardcms,Sql,Performance,Orchardcms,假设我想要查询所有Orchard用户ID,并且我想要包括那些已经被删除(又称软删除)的用户。数据库包含大约1000个用户 选项A-大约需要2分钟 Orchard.ContentManagement.IContentManager lContentManager = ...; lContentManager .Query<Orchard.Users.Models.UserPart, Orchard.Users.Models.UserPartRecord>(Orchard.Cont
Orchard.ContentManagement.IContentManager lContentManager = ...;
lContentManager
.Query<Orchard.Users.Models.UserPart, Orchard.Users.Models.UserPartRecord>(Orchard.ContentManagement.VersionOptions.AllVersions)
.List()
.Select(u => u.Id)
.ToList();
Orchard.ContentManagement.IContentManager lContentManager=。。。;
内容管理员
.Query(Orchard.ContentManagement.VersionOptions.AllVersions)
.List()
.选择(u=>u.Id)
.ToList();
选项B-执行时几乎没有明显的延迟
Orchard.Data.IRepository<Orchard.Users.Models.UserPartRecord> UserRepository = ...;
UserRepository .Fetch(u => true).Select(u => u.Id).ToList();
Orchard.Data.IRepository UserRepository=。。。;
Fetch(u=>true).Select(u=>u.Id).ToList();
在使用选项A时,我没有看到SQL Profiler中执行任何SQL查询。我想这与NHibernate或缓存有关
有没有办法优化选项A 这可能是因为
IContentManager
版本通过InfoSet
(基本上是数据的xml表示形式)访问数据,而IRepository
版本使用实际的DB表本身
我似乎记得读过这样一篇文章:虽然Infoset在很多情况下都很好,但当您使用排序/过滤处理较大的数据集时,直接访问表会更有效,因为使用Infoset需要在访问数据之前解析每个xml片段并提取元素
由于“转移”,Orchard同时使用这两种方法,因此您可以使用最适合您需要的方法。我现在找不到解释它的文章,但这很好地解释了shift&Infoset:
希望这对您有所帮助?如果您使用
.Select()
部分切换.List()
该怎么办?@devqon我无法切换它们,因为Query()
返回了一个IContentQuery
而它不提供Select()
方法。有趣的。。。我对nhibernate有一些问题,但在旧的Orchard版本中。哪个版本?@urbanit它是1.9.0版。