2013-01-06 52 views
2

我已经归一化的国家/地区/城市数据库到多个表。城市拥有一个拥有外国国家的地区的外交钥匙。实体框架和外键关系生成SQL的性能变慢

CITY表包括用于查找相关联的数值IPAddress 2个的附加列。正如你能想象这个城市表中有超过400万的记录(代表其对应回区域,然后一个国家是世界上城市)。

CITYREGIONCOUNTRY是我与实体框架电动工具映射实体,它们有一个名称列(即代表citynameregionnamecountryname,分别),和被索引的主键标识列。

比方说,我有一个表/实体,称为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返回的一个子集实际的访问者(它工作得很快)。典型的子集包含大约10,000行。 Select Distinct声明需要几分钟才能返回。最后,我需要按日期范围(使用visitorhit.datevisited场),以进一步划定distinctCountries并返回计数每个distinctCountry

我如何能加快这一操作任何想法?

+0

有外键列被正确索引?您是否查看了查询的执行计划以查看潜在的瓶颈? –

+0

虽然我在下面推荐一个答案,它也可能是有用的与'VisitorRepository.GetAllSpecialVisitors()的代码来更新你的问题;' –

回答

2

你有没有看SQL事件探查器查看正在为此产生了哪些SQL。我的第一个猜想(因为你不张贴GetAllSpecialVisitors的代码)将是你懒加载在这种情况下,你将要产生多次调用数据库(一个用于在specialVisitors每个实例)市行,以获得市。在呼叫您可以渴望加载城市GetAllSpecialVisistors()

使用.Include("City").Include(v=>v.City)

例如事情是这样的:

var result = from hit in context.VisitorHits 
      where /* predicates */ 
      .Include(h =>h.City) 

就像我说的,你需要看看SQL事件探查器中显示你看到什么SQL实际上被发送到SQL Server。但是当我遇到这样的问题时,结果是最常见的原因。

如果您尝试写在SSMS查询自己和它运作良好,那么另一种解决办法是写一个视图中的一个视图和查询。这是别的东西,我有时完成后实体框架产生不有效地工作笨重查询。