我正在构建需要处理来自数据库的所有产品数据的系统(现在使用200k产品进行测试+数据分布在多个表中)。
我使用NHibernate来完成所有查询。
我创建了一个自定义查询,可以一次性获取ProductIds列表的所有相关数据(试图找到最有效查询数据的最佳切割)。
现在我开始意识到它在一些查询中需要花费5分钟才能完成,最好的情况下需要2秒钟。 (记住它对于相同数量的产品ID完全相同的查询)。这是一个测试运行,我在每个循环中获取200个完整的产品。日志显示(在我看来)相当随机的查询时间:
从数据库中抓取200件产品:00:00:01.9370364 秒。从数据库中抓取200个产品: 00:01:06.8207146秒。
从数据库中抓取200个产品 花了:00:00:58.5194938秒。从中获取了200个产品 数据库拍摄时间:00:00:03.5447583秒。
抓取200个产品 从数据库中取出:00:02:01.6096919秒。
抓住200 数据库中的产品采用:00:00:03.2856333秒 从数据库中获取200个产品:00:02:04.8108302 秒。从数据库中抓取200个产品: 00:00:03.4525576秒。
从数据库中抓取200个产品 拍摄时间:00:01:04.4530670秒。
以上只是一个剪切,所以请不要试图找到一个模式,因为它是随机的。有时它会连续运行10个查询并且查询时间可以接受,有时它只会每隔一秒查询一次。最终会超时。
这似乎是数据库中的查询时间 - 我还附加了一个显示相同长查询时间的sql profiler。
我在运行代码时没有做任何其他事情。我已将隔离级别设置为ReadCommitted - 将其设置得更低并不会影响查询时间。
我想问题是:为了改变性能,我应该寻找哪些东西?我使用的是sql server enterprise 2012 64位版本。
我不是改变查询或数据库架构的忠实粉丝,因为它似乎并不相关?
欢迎任何建议。
祝你好运
的Morten
答案 0 :(得分:0)
为什么不在一段时间内调用ISession.Clear?它将从第一级缓存中删除所有条目,这可能是您不需要的。或者更好的是,使用IStatelessSession而不是常规的ISession。