选择使用实体框架查询SQL server

选择使用实体框架查询SQL server,sql,performance,linq,entity-framework,Sql,Performance,Linq,Entity Framework,我有一个疯狂的简单查询:它从一个表中提取一个ID。实现是使用EF3.5完成的 这个查询在循环中重复,我从文件中收集了一个ID并在数据库中进行搜索。运行此程序时,SQL server承受着巨大的压力(所有16核的处理器利用率飙升至100%) 看起来此查询的表已完全锁定,没有人再进入。我已经读过使用DbTransaction(开始事务,提交)或TransactionScope的必要性,但问题是我只是在选择/阅读。 此外,它是一个查询,本身是原子的,因此事务(范围)的使用充其量是不明确的。 我确实尝试

我有一个疯狂的简单查询:它从一个表中提取一个ID。实现是使用EF3.5完成的

这个查询在循环中重复,我从文件中收集了一个ID并在数据库中进行搜索。运行此程序时,SQL server承受着巨大的压力(所有16核的处理器利用率飙升至100%)

看起来此查询的表已完全锁定,没有人再进入。我已经读过使用
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();