У меня возникают серьезные проблемы с производительностью при задании конкретного вопроса nhibernate.
У меня есть две таблицы, A и B, где A имеет ~ 4000 строк, а B имеет ~ 50 000 строк. Соотношение между А и В одно ко многим.
Итак, вопрос, который я задаю, должен загрузить все объекты в A, а затем принудительно загрузить все объекты в B, потому что я хочу агрегировать по объектам в B.
Я использую fluenthibernate и настроил его так, чтобы разрешить отложенную загрузку, это прекрасно работает для всех остальных вопросов, кроме этого, где мне нужно загрузить ~ 50000 сущностей, это число, вероятно, будет расти с 50 тыс. В месяц. Вопрос занимает больше минуты, чтобы задать его сейчас (возможно, даже медленнее)
Очевидные оптимизации, которые я уже сделал: создайте только один сеанс, ленивая загрузка не отключена.
Так что мой вопрос в том, будет ли nhibernate замедляться в этом аспекте? (то есть я должен создать свой DAL с обычными вопросами SQL, а не с помощью nhibernate?) или есть способ повысить производительность. Это приложение для составления отчетов, поэтому одновременных пользователей не будет, но я все же хотел бы, чтобы этот вопрос занимал не менее 5-10 секунд.
EDIT
Добавляем код:
public class ChatSessions
{
public virtual int Id { get; set; }
public virtual IList<ChatComments> Comments { get; set; }
public ChatSessions()
{
Comments = new List<ChatComments>();
}
}
public ChatCommentsMapping()
{
Id(x => x.Id);
References(x => x.ChatSession);
}
public class ChatComments
{
public virtual int Id { get; set; }
public virtual ChatSessions ChatSession{ get; set; }
public virtual string Comment { get; set; }
public virtual DateTime TimeStamp { get; set; }
public virtual int CommentType { get; set; }
public virtual bool Deleted { get; set; }
public virtual string ChatAlias { get; set; }
}
public ChatSessionsMapping()
{
Id(x => x.Id);
References(x => x.ChatRoom)
.Not.LazyLoad();
HasMany(x => x.Comments)
.Table("chatcomments");
}
Тогда В моем репо я использую этот запрос:
public IList<ChatComments> GetChatCommentsBySession(int chatsessionid)
{
using(var session = _factory.OpenSession())
{
var chatsession = session.Get<ChatSessions>(chatsessionid);
NHibernateUtil.Initialize(chatsession.Comments);
return chatsession.Comments;
}
}
И этот метод вызывается один раз для каждой беседы.
Запрос, с которым я агрегирую, выглядит примерно так:
foreach (var hour in groupedByHour){
var datetime = hour.Sessions.First().StartTimeStamp;
var dp = new DataPoint<DateTime, double>
{
YValue = hour.Sessions.Select(x =>
_chatCommentsRepo.GetChatCommentsBySession(x.Id).Count)
.Aggregate((counter,item) => counter += item),
XValue = new DateTime(datetime.Year, datetime.Month, datetime.Day, datetime.Hour, 0, 0)
};
datacollection.Add(dp);
}