Производительность сопоставления PetaPoco «один ко многим»

Глядя на пример, приведенный на Раздел справки PetaPoco - раздел "Отношения "один ко многим""

В нем описывается, как использовать InnerJoin и средство сопоставления для обработки сопоставления данных отношения "один ко многим"...

var authors = db.Fetch<author, post, author>(
new AuthorPostRelator().MapIt,
"SELECT * FROM authors LEFT JOIN posts ON posts.author = authors.id ORDER BY posts.id"
);

Это нормально для небольших таблиц, но для больших объемов данных загрузка этих данных происходит очень медленно.

Это не "автор", но чтобы язык оставался прежним...

У моего автора 30 столбцов. У меня 90 000 авторов, и у каждого автора 50 сообщений.

Этот запрос выше выведет 4 500 000 строк данных... в этих данных строки авторов дублируются 50 раз... имеет ли это значение?

Есть ли способ загрузить эти данные быстрее? Я пропустил трюк где-нибудь вдоль линии?


person Paul    schedule 29.06.2014    source источник
comment
Насколько медленно? Просто предположение, но похоже, что вы одновременно загружаете в память очень много данных, и что, вероятно, это будет вялым, независимо от того, как вы это делаете. Вы уверены, что PetaPoco является вашим узким местом?   -  person Todd Menier    schedule 29.06.2014
comment
Зачем нужно загружать все данные сразу?   -  person Eduardo Molteni    schedule 30.06.2014


Ответы (1)


Принимая во внимание, что редко приходится работать более чем с одним автором одновременно, я бы извлек сообщения только для требуемого автора, используя следующий формат:

 var author = db.SingleOrDefault<Author>("WHERE id= @0", authorId);
 if (author != null)
 {
     var posts= _db.Query<Post>("WHERE Id = @0 ", author.Id).ToList();
     author.Posts.AddRange(posts);
 }
 return author;

Таким образом, я избегаю левого соединения и получаю необходимые сообщения автора без каких-либо потерь производительности.

Таким образом, вы даже можете ограничить возвращаемые сообщения, добавив дополнительные условия в предложение where сообщений следующим образом:

 var posts= _db.Query<Post>("WHERE Id = @0 AND Cond1 = @1", author.Id, cond1).ToList();

Вы даже можете ограничить количество столбцов, возвращаемых автором, определив модель требуемых столбцов и заменив

var author = db.SingleOrDefault<Author>("WHERE id= @0", authorId);

с участием

var author = db.SingleOrDefault<AuthorModel>("WHERE id= @0", authorId);
person kagundajm    schedule 02.07.2014