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()的代码更新您的问题也可能有用代码>