【发布时间】:2012-02-16 18:52:20
【问题描述】:
我有一个相当大的表,大约有 10,000,000 行。我需要从我的 C# 应用程序中翻阅此表。我正在使用 NHibernate。我曾尝试使用此代码示例:
return session.CreateCriteria(typeof(T))
.SetFirstResult(startId)
.SetMaxResults(pageSize)
.List<T>();
当我执行它时,如果我的 startId 大于 7,000,000,操作最终会超时。我使用的 pageSize 是 200。我已经在小于 1000 行的小得多的表上使用了这种方法,而且它工作起来很快。
问题是,在这么大的桌子上,有没有更好的方法来使用 NHibernate 完成这个任务?
【问题讨论】:
-
哪个rdbms?或者 SQL 是什么样的?也许尝试在那里扔一个 OrderBy...
-
它是 MSSQL2005。立即尝试订购。
-
顺序实际上没有任何区别,但我确实发现将 startId 更改为较低的值可以完成操作。它似乎以大约 7,000,000 或更高的 startId 值窒息。任何较低的东西都是缓慢的,但至少完成。
-
您能否启动 SQL Server Profiler 并查看触发了哪个查询?然后从工作室手动启动它。这不一定是 NHibernate 的问题。您的 NHibernate 查询可能无法在 SQL 中应用限制,但稍后会修剪该结果。
-
你说得对,是 SQL Server 速度慢。我从 SQL Server Profiler 中提取查询并从 Management Studio 中运行它。花了将近一分钟。所以,我的问题仍然存在,有没有更有效的方法来使用 NHibernate 做到这一点?我们试图摆脱存储过程,因为它们难以管理。
标签: sql-server nhibernate paging