【发布时间】:2014-06-06 10:14:04
【问题描述】:
我正在构建需要处理数据库中所有产品数据的系统(现在测试 200k 产品 + 分布在多个表中的数据)。
我使用 NHibernate 进行所有查询。
我创建了一个自定义查询,可以一次性获取 ProductIds 列表的所有相关数据(试图找到最有效的查询数据的最佳切入点)。
现在,我正在努力解决某些查询需要长达 5 分钟才能完成的事实,在最好的情况下需要 2 秒。 (请记住,对于相同数量的产品 ID,这是完全相同的查询)。这是一个测试运行,我在每个循环中获取 200 个完整的产品。日志显示(在我看来)相当随机的查询时间:
从数据库中抓取 200 件产品耗时:00:00:01.9370364 秒。
从数据库中获取 200 个产品需要: 00:01:06.8207146 秒。
从数据库中抓取 200 个产品 耗时:00:00:58.5194938 秒。
从 数据库耗时: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 分析器。
在运行代码时我没有做任何其他事情。我已将隔离级别设置为 ReadCommitted - 将其设置得较低似乎不会影响查询时间。
我想问题是:我应该寻找哪些东西来改变性能?我使用的是 sql server enterprise 2012 64 位版本。
我不太喜欢更改查询或数据库架构,因为它似乎不相关?
欢迎提出任何建议。
最好的问候
莫顿
【问题讨论】:
-
你说你在 SQL profiler 上有相同的结果(顺便说一句,它没有附加),这意味着它是数据库,它怎么可能是 Nhibernate?我绝对会安装 NHProfiler,因为它可以向您显示大量信息(统计数据),这将有所帮助。
-
附加是一个糟糕的表达:) 好吧,这只是一个可能有用的信息。我已经考虑过了。不确定它会提供多少。只需一次调用即可执行查询。不过我会尝试一下。这是一个很棒的工具!我关心的事情:是由于锁定吗?还是仅仅是数据库资源不足?
-
您是否检查过缺失的索引、错误的查询计划或过时的统计信息?参见例如stackoverflow.com/a/15549211/1236044
标签: sql nhibernate fluent-nhibernate query-performance