Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 尝试使用EF 5从庞大的SQL Server表中查询数据_Sql Server_Linq_C# 4.0_Entity Framework 5 - Fatal编程技术网

Sql server 尝试使用EF 5从庞大的SQL Server表中查询数据

Sql server 尝试使用EF 5从庞大的SQL Server表中查询数据,sql-server,linq,c#-4.0,entity-framework-5,Sql Server,Linq,C# 4.0,Entity Framework 5,我正在处理一个包含8000万(8000000)行的SQL Server表。数据空间=198000 MB。毫不奇怪,针对该表的查询经常会出现混乱或超时。要添加到问题中,表行会相当频繁地更新,并且还会定期添加新行。因此,它继续像病毒爆发一样增长 我的问题是,我想编写Entity Framework 5 LINQ to Entities查询,以从这个monster表中获取行。正如我所尝试的那样,超时已经成为一种普遍现象。还有几件事:表的主键是索引的,在19列中的4列上有非聚集索引 到目前为止,我正在编

我正在处理一个包含8000万(8000000)行的SQL Server表。数据空间=198000 MB。毫不奇怪,针对该表的查询经常会出现混乱或超时。要添加到问题中,表行会相当频繁地更新,并且还会定期添加新行。因此,它继续像病毒爆发一样增长

我的问题是,我想编写Entity Framework 5 LINQ to Entities查询,以从这个monster表中获取行。正如我所尝试的那样,超时已经成为一种普遍现象。还有几件事:表的主键是索引的,在19列中的4列上有非聚集索引

到目前为止,我正在编写使用事务作用域和读取未提交隔离级别的简单LINQ查询。我已经尝试增加命令超时和连接超时。我编写了返回
FirstOrDefault()
或集合的查询,例如以下内容,试图从当前日期前七天获取单个ID(int):

public int GetIDForSevenDaysAgo(DateTime sevenDaysAgo)
{
    using (var txn = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }))
    {                
        var GetId = from te in _repo.GetTEvents()
                    where te.cr_date > sevenDaysAgo
                    orderby te.cr_date
                    select te.id;

        return GetId.FirstOrDefault();
    }
}

public IEnumerable GetIDForSevenDaysAgo(DateTime sevenDaysAgo)
{
使用(var txn=newtransactionscope(TransactionScopeOption.Required,newtransactionoptions{IsolationLevel=IsolationLevel.ReadUncommitted}))
{                
var GetId=来自_repo.GetTEvents()中的te
其中te.cr_date>sevenDaysAgo
订购人te.cr\U日期
选择te.id;
返回GetId.Take(1);
}
}
无论超时设置如何,每个查询都会重复超时。我将存储库模式与Unity DI一起使用,并通过
IQueryable
调用获取表。我还将存储库调用限制为从当前日期起八天(希望只获取这个庞大表所需的子集)。我正在使用Visual Studio 2013和更新5,目标是.NET v4.5和SQL Server 2008 R2

我生成了EF生成的SQL语句,它看起来并不比上面的LINQ语句复杂。我的大脑也很痛


那么,我是否达到了EF的某种公差极限?这张桌子是不是太大了?查询此表时是否应恢复到存储过程/域方法?我还有其他的选择吗?关于删除表中的一些行进行了一些讨论,但这可能不会很快发生。我确实读过一些关于分页的文章,但我不确定这是否有用。任何想法或想法都将不胜感激!谢谢大家!

因为我可以看到您只选择数据,而不更改它。那么,为什么需要使用
TransactionScope
?只有当您的代码中有两个或多个
SaveChanges()
并且希望它们位于一个事务中时,才需要它。所以,摆脱它

在您的案例中,我将使用的另一件事是禁用更改跟踪和自动检测上下文中的更改。但是,如果您没有在每个请求上重新读取上下文,请小心。它可以预先列出旧数据

为此,应在上下文初始化附近写以下几行:

context.ObjectTrackingEnabled = false;
context.DeferredLoadingEnabled = false;
你应该考虑的另一件事是分页和缓存。但正如我在你的例子中看到的,你试图只得到一行。所以我不能说什么特别的


我建议您阅读以进一步优化。

很难说您是否必须使用存储过程或EF,因为我们说的是怪物。:-)

我要做的第一件事是在显示实际执行计划的SSMS中运行查询。有时,它会提供有关缺少索引的信息,这可能会提高性能

从你的例子来看,我很确定你需要一个日期列的索引

换句话说,如果您有访问权限,请确保表设计对于该数据量是最佳的


我的想法是,如果一个简单的查询挂起,EF还能做什么?

您能显示EF生成的查询和表结构,如果可以的话,再加上一个查询计划吗。第一个问题:您的表上是否有一个包含
te.cr\u date
列的索引(单独或作为索引中的第一列)?
context.ObjectTrackingEnabled = false;
context.DeferredLoadingEnabled = false;