Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/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
Asp.net mvc 实体框架和外键关系导致sql性能低下_Asp.net Mvc_Sql Server 2008_Entity Framework 5 - Fatal编程技术网

Asp.net mvc 实体框架和外键关系导致sql性能低下

Asp.net mvc 实体框架和外键关系导致sql性能低下,asp.net-mvc,sql-server-2008,entity-framework-5,Asp.net Mvc,Sql Server 2008,Entity Framework 5,我已将国家/地区/城市数据库规范化为多个表。城市对地区有外键,而地区对国家有外键 CITY表包含两个附加列,用于查找关联的数字IPAddress。正如您可以想象的那样,city表有超过400万条记录(表示世界上的城市,这些城市映射到一个地区,然后映射到一个国家) 城市,地区,国家是我用实体框架工具映射的实体,它们都有一个名称列(分别表示城市名称,地区名称,国家名称),以及一个索引的主键标识列 假设我有一个名为VisitorHit的表/实体,它有以下列: id as int (primary ke

我已将国家/地区/城市数据库规范化为多个表。城市对地区有外键,而地区对国家有外键

CITY
表包含两个附加列,用于查找关联的数字
IPAddress
。正如您可以想象的那样,city表有超过400万条记录(表示世界上的城市,这些城市映射到一个地区,然后映射到一个国家)

城市
地区
国家
是我用实体框架工具映射的实体,它们都有一个名称列(分别表示
城市名称
地区名称
国家名称
),以及一个索引的主键标识列

假设我有一个名为
VisitorHit
的表/实体,它有以下列:

id as int (primary key, identity)
dateVisited as datetime 
FK_City as int (which has a many to one relationship to the CITY entity)
在代码中,我使用
VisitorHit
实体,如:

var specialVisitors = VisitorRepository.GetAllSpecialVisitors();
var distinctCountries = specialVisitors.Select(i => i.City.CityName).Distinct().ToArray();
现在,
GetAllSpecialVisitors
返回实际访问者的一个子集(而且运行速度非常快)。典型的子集包含大约10000行。
selectdistinct
语句需要几分钟才能返回。最后,我需要按照日期范围(使用
visitorhit.datevisited
字段)进一步划分
distinctCountries
,并返回每个
distinctCountry
的计数


关于如何加速此操作,您有什么想法吗?

您是否查看了SQL Profiler,以了解为此生成了哪些SQL。我的第一个猜测(因为您没有发布
GetAllSpecialVisitors
)的代码)是,您在懒洋洋地加载City行,在这种情况下,您将生成多个对数据库的调用(在
specialVisitors
中,每个实例一个),以获取City。您可以通过调用
GetAllSpecialVisistors()
来加载城市

使用
.Include(“城市”)
.Include(v=>v.City)

e、 g.类似这样的情况:

var result = from hit in context.VisitorHits
             where /* predicates */
             .Include(h =>h.City)
正如我所说,您需要查看SQL事件探查器向您显示的内容,以查看实际将哪些SQL发送到SQL服务器。但当我遇到这样的问题时,这是最常见的原因


如果您尝试自己在SSMS中编写查询,并且效果良好,那么另一种解决方案可能是在该视图上编写视图和查询。有时候,当实体框架生成不高效的笨拙查询时,我也会这样做

外键列是否已正确索引?您是否查看了查询的执行计划以查看任何潜在的瓶颈?尽管我在下面建议了一个答案,但使用
VisitorRepository.GetAllSpecialVisitors()的代码更新您的问题也可能有用