选择使用实体框架查询SQL server
我有一个疯狂的简单查询:它从一个表中提取一个ID。实现是使用EF3.5完成的 这个查询在循环中重复,我从文件中收集了一个ID并在数据库中进行搜索。运行此程序时,SQL server承受着巨大的压力(所有16核的处理器利用率飙升至100%) 看起来此查询的表已完全锁定,没有人再进入。我已经读过使用选择使用实体框架查询SQL server,sql,performance,linq,entity-framework,Sql,Performance,Linq,Entity Framework,我有一个疯狂的简单查询:它从一个表中提取一个ID。实现是使用EF3.5完成的 这个查询在循环中重复,我从文件中收集了一个ID并在数据库中进行搜索。运行此程序时,SQL server承受着巨大的压力(所有16核的处理器利用率飙升至100%) 看起来此查询的表已完全锁定,没有人再进入。我已经读过使用DbTransaction(开始事务,提交)或TransactionScope的必要性,但问题是我只是在选择/阅读。 此外,它是一个查询,本身是原子的,因此事务(范围)的使用充其量是不明确的。 我确实尝试
DbTransaction
(开始事务,提交)或TransactionScope
的必要性,但问题是我只是在选择/阅读。
此外,它是一个查询,本身是原子的,因此事务(范围)的使用充其量是不明确的。
我确实尝试了一个实现,但似乎没有成功
My(LINQ)查询:Image Image=context.Images.First(i=>i.ImageUid==identifier)
你有没有想过为什么会这样?我想再次强调,我只是选择/阅读记录。我不会删除或更新数据库中的记录。这是如此疯狂的直截了当,令人沮丧
为了完成(我的修复尝试):
新建:探查器显示实体框架正在图像表中执行SELECT TOP(1)。这相当于大量的阅读,数十万次!
这意味着没有索引,但我已经查过了(见评论),有一个!也很奇怪,在注销时,又读了数十万遍
我决定抛弃实体框架,使用SqlConnection和SqlCommand进行查询,但结果是一样的
接下来,我们在管理控制台中复制了sp_executesql,发现执行耗时惊人的4秒。执行“直接”查询会立即得到结果
sp_executesql
中的某些内容似乎使事情变得缓慢。有什么想法吗?我想我明白了。。。在发现sp_executesql是罪魁祸首后,事情变得明朗了。
看
由于愚蠢的转换,表上的索引未被使用!
这解释了SQL分析器中所有可见的内容
现在这个工具正在测试中,它的速度和照明一样快 为此生成的SQL应该相当简单。您尝试执行此查询多少次?支持
图像的表有多大?ImageUid列上有索引吗?最后,您能发布执行此查询时使用的预测和实际查询计划吗?您能使用探查器获取正在创建的实际SQL吗?我更惊讶的是您能够创建这样的图像。告诉我您有一个Images.ImageUid索引,否则,您将有16个线程运行table scans,使CPU最大化。查询量受指定文件夹中图像文件数量的限制。这一数字从几千到十分之一不等。images表包含数百万条记录。所以我的第一个动作是检查索引。我还将获得计划的和实际的查询计划。
// This defaults the isolation level to 'READ COMMITTED' which
// doesn't lock the table when querying.
DbTransaction trx = context.Connection.BeginTransaction();
string isolationLevel = trx.IsolationLevel.ToString();
Image image = context.Images.First(i => i.ImageUid == identifier);
trx.Commit();