Отображение O / R: один сложный запрос против нескольких простых запросов - PullRequest
0 голосов
/ 18 февраля 2011

Меня интересует, как набор результатов SQL-запроса переносится с сервера на клиент.

Большинство картографов O / R поддерживают как рыхлую, так и ленивую загрузку, у обоих есть свои плюсы и минусы.Например, Entity Framework4 (.NET) имеет прекрасную поддержку загрузки.

Однако, давайте предположим, что у нас есть такая модель:

BlogPost
{
    public string Body {get;set;}
    ICollection<Comment> Comments {get;set;}
}

...

изапрос, подобный следующему:

var posts = context
          .Posts
          .Include(post => post.Comments)
          .Where(post => post.Id == 1)
          .First();

Это приведет к одному запросу SQL, в котором все данные для «сообщения» будут повторяться в каждой строке для каждого «комментария»

Допустим, мыесть 100 комментариев к конкретному сообщению, и Post.Body - это огромная часть текста.это не может быть хорошо?Или данные каким-то образом сжимаются при отправке клиенту, что сводит к минимуму издержки на повторение данных в каждой строке?

Как лучше всего определить, является ли один такой запрос более эффективным, чем два простыхзапросы (один для получения поста и один для получения комментариев)?

Сравнение этого в среде разработчика довольно бессмысленно, здесь есть несколько факторов: загрузка ЦП на сервере SQL Сетевая нагрузка Загрузка ЦПна сервере приложений (материализация объектов)

Идеи на этот счет?

[Изменить] Уточнение:

Два запроса будут выглядеть примерно так:

sql

select * from post where postid = 123

результат

id , topic, body , etc...

sql

select * from comment where postid = 123

результат

id,postid, commenttext , etc...

первый запрос дастодна строка и 2-й запрос дадут столько строк, сколько есть комментариев.

в одном запросе будет столько строк, сколько есть комментариев для конкретного поста, но со всеми данными поста, повторенными для каждого поста.ряд.

result

p.id , p.topic, __p.body__, c.id, c.postid, c.commenttext

p.body будет повторяться в каждой строке, что делает набор результатов чрезвычайно большим.(при условии, что p.body содержит много данных, которые есть; -)

Ответы [ 2 ]

0 голосов
/ 18 февраля 2011

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

Однако в вашем случае сначала выполняется поиск пользователя, а затем все комментарииодин запрос), вероятно, более эффективен, чем получение всего в одном запросе.

0 голосов
/ 18 февраля 2011

Я думаю, это действительно сводится к следующему:

  • Сколько существует постов?
  • Насколько сложно получить комментарии к посту?

Если у вас несколько миллионов постов, будет лучше использовать один запрос, даже если у вас есть несколько комментариев для каждого поста, потому что агрегированное время туда-обратно будет намного хуже, чем время для передачи дополнительногоdata.
Итак, я думаю, что вам нужно иметь острый взгляд; -)
А также, я думаю, что сравнительный анализ в среде dev не является бессмысленным, потому что он может дать как минимум отношения между двумя способами выполненияэто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...