1

10000 行を含むデータベース テーブル (PostgreSQL):

CREATE TABLE test
(
  id bigserial NOT NULL,
  text text,
  CONSTRAINT test_pkey PRIMARY KEY (id)
)

クラス:

public class Test
{
    public virtual int ID { get; set; }
    public virtual string Text { get; set; }
}

public class TestMap : ClassMap<Test>
{
    public TestMap()
    {
        Table("test");
        Id(x => x.ID, "id");
        Map(x => x.Text, "text");
    }
}

データベースにクエリを実行する方法は次のとおりです。

using (ISession session = SessionBuilder.OpenSession())
{
    Stopwatch s = new Stopwatch();

    s.Start();
    var result = session.QueryOver<Test>().Where(test => test.Text == "aaa").List();
    s.Stop();
    Console.WriteLine(s.ElapsedMilliseconds); // >150ms

    s.Restart();
    var result2 = session.QueryOver<Test>().Where(test => test.Text == "bbb").List();
    s.Stop();
    Console.WriteLine(s.ElapsedMilliseconds); // ~4ms
}

最初のクエリに時間がかかるのはなぜですか? それをスピードアップする方法はありますか?

4

3 に答える 3

0

考えられる解決策 1:
数年前からパフォーマンスの問題を調べていて、NHibernate で使用される XML シリアライザーの初期化に問題があることがわかりました。Jira でバグとその修正を報告しました: https://nhibernate.jira.com/browse/NH-2958

nhibernate ソースで私の修正を試して、問題が解決するかどうかを確認してください。この問題は、jira システムに従って nhibernate の次のリリースで修正される予定です。

考えられる解決策 2:
解決策 1 が機能しない場合は、各クラスマッピングのマッピングで動的更新と動的挿入を true に設定してみてください。Hibernate は、マッピングをコンパイルするときに、可能なすべてのクエリを作成します。

于 2013-06-13T11:00:51.060 に答える