-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プロファイラーを使用してクエリをトレースし、クエリをコピーしてmsmsで実行し、50ミリ秒を使用して非常に高速にデータを取得しますが、nhibernateを使用して、小さなデータのコストが10秒でもタイムアウトする場合にデータをリストします。投稿するいくつかの方法を試しましたサイト、キャッシュのクリア、statelesssession の使用の両方とも、言葉が通じませんでした。誰の体もそれを改善する方法を知っていますか.トンに感謝します.

4

1 に答える 1

1

まず、SQL インジェクションに対してオープンであるため、SQL ステートメントを作成するときに実際に文字列連結を使用するべきではありません。これは戻ってきて、将来あなたを噛むでしょう。この記事のSQL インジェクションを調べて、代わりにパラメーター化されたクエリを使用してください。

さて、あなたの質問のために、考えるべきことがいくつかあります:-

  1. where句はすべてのテストで同じですか?
  2. インデックスが問題の原因ですか?
  3. 何が起こっているかを確認するために、SSMS のクエリ プランを調べましたか?
  4. 2 回目に同じ SQL を 2 回実行すると、SQL Server にキャッシュされるため、2 回目にはより高速な時間が表示されます。

脚注として、問題を引き起こしているのはNHibernateではありませんが、SQL Serverと実行中のクエリです。まずはこれを見ることをお勧めします。

于 2012-05-23T06:06:57.570 に答える