目前我们有一个复杂的业务对象,我们的sql数据库需要大约30个连接来检索一个项目。 (这是我们的主要用例)。数据库在sql server中大约是2Gb。 我们使用实体框架来检索数据,并且需要大约3,5秒来检索一个项目。我们已经注意到,当在另一个表中有很多行时,在并行调用中使用子查询比使用连接更有效。 (所以我们有10个子查询之类的东西)。我们不使用存储过程,因为我们希望将数据访问层保留在“plain c#”中。
目标是在不改变环境的情况下在1秒内检索项目。 我们正在研究没有sql解决方案(RavenDB,Cassandra,带有“文档客户端”的Redis)和sql server的新功能“内存数据库”。
你推荐什么?您是否认为只有一个存储过程调用EF才能完成这项工作?
编辑1: 我们在连接的所有列上都有索引
答案 0 :(得分:1)
在我看来,如果你需要30个连接来检索一个项目,那么数据库的设计就会出错。从关系的角度来看,这可能是正确的,但从功能/绩效的角度来看,这是完全不切实际的。
我想到了几个解决方案:
反规范化您的数据库设计。 我很确定你可以通过这种技术减少连接数,从而大大提高你的性能。 http://technet.microsoft.com/en-us/library/cc505841.aspx
使用你提到的NoSQL解决方案。 由于涉及的SQL表的数量,这不会是一个简单的更改,但也许你可以开始为这个复杂的对象引入NoSQL,就像缓存一样。 NoSQL Use Case Scenarios or WHEN to use NoSQL
当然,使用这种情况下的存储过程要好得多,它会提高性能,但我不认为会发生戏剧性的变化。你应该尝试id和比较。同时修改所有索引。