我们正在使用winforms和sql server 2008在vs2008中开发桌面应用程序。目前,我们在表单加载时进行了大量的dbase调用(linq to sql),因此这使得应用程序真正变慢。一个选项是加载所有的应用程序加载开始时所需的数据,并将其存储在缓存中(只是静态集合)。我们应该看看还有哪些其他选项?在线是否有可用的指南?
感谢
答案 0 :(得分:1)
选项1.删除LINQ to SQL。认真。除非你真的知道自己在做什么,否则最终会遇到大量的性能问题...就像你所描述的那样。
选项2.不要在表单加载中执行所有操作。相反,直到表单加载之后,然后开始运行这些查询。在用户看到表单之前,您真的需要一切吗?很可能不是。
选项3.将表单分成多个表单。换句话说,将每个单独表单的复杂性降低到它所处理的数据量较小的程度。
选项4.您是否从数据库中提取了大量基本静态列表(例如美国国家/地区)?考虑将这些放入枚举中。看看实际改变的可能性极小的任何事情。
答案 1 :(得分:1)
Junky,
我第一次来到客户端网站的时候总是看到这个。大多数本土应用程序遵循“加载所有内容然后过滤它”的数据方法。这非常简单,可以帮助您快速前进,但这将不可避免地导致您刚刚提到的内容。
我向您提出挑战,假设您的应用在启动时不需要加载任何数据,除非是基本配置。
让它沉入其中,然后考虑对数据库进行过滤调用,因为应用程序用于获取块。
此外,更加深入地了解您的LINQ并确保您的基础数据模型已经过优化。如果你有3个巨大的表,尝试规范化,LINQ会做得更好,LINQ会变慢。
此外,LINQ本身应该在“where”部分中尽可能多地使用过滤器。
然后当然总是只限制返回的行数。问问自己用户是否真的可以看到10万件东西?祝好运。
答案 2 :(得分:1)
您的CRUD操作可能需要很多调用 - 一旦您的应用程序正常运行(并且只有那时),就可以将这些调用优化为更高级别的操作,从而获得前端所需的数据 - 端。
希望您已将LINQ内容与DAL类中的其他应用程序分开 - 如果您还没有这样做 - 它将使实际存储过程(对于您最密集的操作)更容易进行优化。 / p>
使用DAL方法彻底彻底 - 传递简单类型,几乎就像存储过程本身一样。为EACH方法的行数据的返回类型创建一个新类型(如果有多个“行”,则返回一个数组)。不要在DAL之外使用自动生成的LINQ类型,而是在选择期间将值复制到新类型中。
另外,请注意LINQ及其在单个事务中使用多个sql调用的连接 - 您可能在没有意识到的情况下使用分布式事务协调器。
答案 3 :(得分:1)
这里的几个答案似乎很重要,因为假设和光泽最重要的一点是:
使用分析器。一个好的免费的是EQATEC。或者,如果确实如此,真的慢,只需单步执行该程序即可。还可以使用SQL Server Profiler查看查询本身的情况。
问题可能根本不是缓存问题。它可能是一个优化不佳的数据库。它可能是一个缓慢的网络连接。它甚至可能是代码中完全不相关的东西。除非你检查,否则无法确定。
话虽如此,如果问题确实只是“过多”的数据库调用,那么可以采取一些方法,不会导致应用程序加载时间出现大幅增长:
第一次使用时缓存数据;
切换到使用返回多个结果集的存储过程(使用IMultipleResult
- 示例here)。这对于几组数据仅需要一次往返。或者,如果可以,将结果合并到一个查询/结果中,如果您当前单独查询的数据可以全部JOIN
组合在一起。
在后台线程中执行数据访问操作(即使用BackgroundWorker
)。问题通常不是真正的实际速度,而是在发生UI时阻止用户界面。
立即启动您的应用程序而不预先加载任何数据,但立即开始在后台线程中预加载。添加一些同步代码,以便如果用户在完全加载之前执行了需要数据的操作,它将等待预加载器完成。
使用一个抽象层,例如WebService,它“非常”靠近数据库服务器,并且不会受到大量往返的伤害。然后,这可以提供与单个UI屏幕/表单相关的所有数据。
所有这些都是复杂的选项,可能需要对应用程序架构进行重大改进。如果您只需使用索引优化一些查询,或将多个查询合并为一个查询,那么您的生活将变得更加轻松。首先尝试找出为什么 - 我的意思是具体为什么应用程序很慢;那么只然后你应该认真考虑上述任何选项。