【发布时间】:2011-10-19 06:46:10
【问题描述】:
我使用 nhibernate 作为 ORM。我的选择之一是令人难以置信的慢。问题是,生成 sql 需要很长时间。我确定不是 sql 查询本身很慢,因为我使用 sql profiler 对查询本身进行了计时。它表明在开始执行 nhibernate 代码和实际发送到数据库的查询之间存在约 15 秒的间隔。生成的 SQL 查询本身与我预期的一样快。
选择代码(在存储库中)如下
public IEnumerable<Document> GetAllDocumentsReadyForDeletion()
{
return from doc in _session.Query<Document>()
where doc.StorageType == 'D'
select doc;
}
我也试过了:
return _session.CreateCriteria<Document>()
.Add(Restrictions.Eq("StorageType", 'D'))
.List<Document>();
wich 是等价的(对吗?)。但是,它们的性能大致相同(很慢,比如生成 sql 查询需要 15 秒)
但是,它的执行速度与我希望的一样快,但我不知道为什么:
return _session.CreateQuery(
"from Document doc where doc.StorageType = 'D'")
.List<Document>();
我真的很想使用 linq to nhibernate 版本。知道为什么代码执行不同吗? (如果您需要更多详细信息,请询问!)
编辑1
哦,伙计,我犯了一个愚蠢的错误还是什么..我错误地读取了 sql profiler 中的错误列.. 嗯,前两个的实际执行时间约为 18 秒,第三个约为 0 秒。我正在尝试查找 sql atm 中的差异...
编辑2
这实际上变成了一个完全不同的问题。结果查询几乎完全相同,除了前两个被包装在“exec sp_executesql”中
现在我用查询分析器跟踪了一下,慢查询有一个步骤:
clustered index scan.
快速查询分两步:
Index seek
Bookmark lookup
有类似的经验吗?
【问题讨论】:
-
"生成 sql 需要很长时间" -> 使用 SQL 分析器看不到...
-
@Mauricio 我的意思是我在执行代码示例之前打印了一条消息,同时我正在使用 SQL 分析器监视 sql 服务器。这样我可以看到从开始执行语句到将 sql 查询发送到 sql server 需要很长时间。我澄清了我的问题。
标签: sql performance sql-server-2000