我有一张相当大的表,大约有10,000,000行。我需要从我的C#应用程序中翻阅此表。我正在使用NHibernate。我试图使用这个代码示例:
return session.CreateCriteria(typeof(T))
.SetFirstResult(startId)
.SetMaxResults(pageSize)
.List<T>();
当我执行它时,如果我的startId大于7,000,000,则操作最终会超时。我正在使用的pageSize是200.我已经在更小的表上使用了这个方法,少于1000行,并且它的工作和执行速度很快。
问题是,在这么大的表上有没有更好的方法来使用NHibernate来实现这个目标?
答案 0 :(得分:2)
您是否尝试一次翻页1000万行?为什么?没有人会通过这么多数据进行分页。
您需要先过滤数据集,然后将TSQL样式分页应用于较小的数据集。 Here are some methods that will work。只需修改它们,以便通过某种过滤(WHERE子句,CTE或派生表)获得少于1000万行。
答案 1 :(得分:1)
有趣的是你应该提出这个问题,因为我遇到同样的问题。我的问题与使用NHibernate的分页无关,但更多的是使用直接的T-SQL。
似乎有一些选择。我发现在我的实例中非常有用的一个是this answer关于分页的问题。它讨论了使用“..keyset驱动的解决方案”,而不是通过使用ROW_NUMBER()返回排名结果。我不确定NHibernate会在这个实例中使用什么,或者是否可以根据你发出的查询看到它生成的SQL(我知道你可以在Hibernate中,但我没有使用过NHibernate)。
如果您不知道使用SQL SERVER根据ROW_NUMBER返回排名结果,那么值得深入研究。很多人似乎都提到this article如何进行分页。我已经看到一些后续帖子不鼓励使用SET ROWCOUNT,但赞成使用TOP和动态参数 - SELECT TOP(@NumOfResults)。
关于这一点,这里有很多关于SO的帖子,但就我所能看到的最佳方式而言,没有明确的答案。我会密切关注这篇文章,看看其他人的建议。
答案 2 :(得分:1)
它可以通过隔离层问题。
我有类似的问题。 如果您的读取表不断更新,则更新程序会锁定表的某些部分,从而导致超时,然后从表中读取。 添加SetIsolationLayer(ReadUncommitted)你必须注意数据可能有点脏。