-1
int pageSize = 36;
int pageIndex=1; 

IMultiQuery multiQuery = _session.CreateMultiQuery();
            multiQuery
                .Add(session.CreateQuery("select * from Smart_Products where " + where + " order by " + orderBy)
                    .SetFirstResult((pageIndex - 1) * pageSize)
                    .SetMaxResults(pageSize))
                .Add(session.CreateQuery("select count(*) c from Smart_Products where " + where))
                .SetInt32("BrandId", brandId)
                .SetInt32("Flag", flag)
                .SetInt32("Status", 1);
            if (categoryId > 0)
            {
                multiQuery.SetInt32("CategoryId", categoryId);
            }
            IList results = multiQuery.List();
            foreach (var o in (IList)results[0])
                products.Add((ProductInfo)o);
            long count = (long)((IList)results[1])[0];

对大数据(例如,所有行数为 1000000 行)进行分页时,相同的查询可以快速获得结果,但小数据(例如,所有行数为 5 行)速度较慢。

但是我使用 sql profiler 来跟踪查询,并复制查询在 msms 中执行它非常快地使用 50ms 获取数据,但是当小数据花费 10s 甚至超时时使用 nhibernate 列出数据,我尝试了一些发布的方法该站点,清除缓存和使用无状态会话都没有得到消息。任何人都知道如何改进它。非常感谢。

4

1 回答 1

1

首先,您对 SQL 注入持开放态度,在构建 SQL 语句时,您永远不应该真正使用字符串连接。这将来会回来咬你。请抽出时间查看这篇文章SQL Injection并改用参数化查询。

现在对于您的问题,需要考虑一些事情:-

  1. 每个测试的 where 子句是否相同?
  2. 索引是问题的原因吗?
  3. 您是否查看过 SSMS 中的查询计划以了解发生了什么?
  4. 当您第二次运行相同的 SQL 两次时,它会缓存在 SQL Server 上,这就是为什么您第二次会看到更快的时间。

作为脚注,它不是NHibernate导致问题,而是SQL Server 和您正在运行的查询。我建议你先看看这个。

于 2012-05-23T06:06:57.570 回答