Как оптимизировать этот запрос Linq - PullRequest
0 голосов
/ 02 июня 2010

Я пытаюсь оптимизировать этот запрос. Пока это не медленно, но я ожидаю, что всплеск ударит по этому запросу в ближайшем будущем. Что еще я могу сделать, чтобы сделать этот запрос быстрее?

var posts = from p in context.post
                        where p.post_isdeleted == false && p.post_parentid == null
                        select new
                        {
                            p.post_date,
                            p.post_id,
                            p.post_titleslug,
                            p.post_title,
                            p.post_descriptionrender,
                            p.userinfo.user_username,
                            p.userinfo.user_userid,
                            p.userinfo.user_GravatarHash,
                            p.userinfo.user_points,
                            p.category.catid,
                            p.category.name,
                            p.post_answercount,
                            p.post_hasbestanswer,
                            p.post_hits,
                            p.post_isanonymous,
                            p.post_votecount,
                            FavoriteCount = context.favorites.Where(x => x.post.post_id == p.post_id).Count(),
                            tags = from tg in context.posttag
                                   where tg.posttag_postid == p.post_id
                                    select new
                                    {
                                        tg.tag.tag_id,
                                        tg.tag.tag_title
                                    }
                        };

Ответы [ 3 ]

0 голосов
/ 02 июня 2010

Возможна оптимизация для этого запроса, только для загрузки идентификаторов других связанных объектов (UserInfo, Category, Tag) и инициализации этих объектов только по требованию с использованием стратегии отложенной загрузки. Или выполнить другой запрос для разрешения этих объектов.

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

0 голосов
/ 02 июня 2010

Я мог бы сделать LINQ чище ( используя ассоциации вместо psuedo-joins ), но это не сделало бы это быстрее.Чтобы сделать это быстрее , вам, вероятно, нужно взглянуть на индексацию БД.

0 голосов
/ 02 июня 2010

В общем смысле вы можете изучить кеширование этой информации, но нет ничего «медленного» в запросе. Это действительно будет зависеть от того, как используется запрос (как часто, какие данные попадают в систему и т. Д.). Существует множество возможных оптимизационных решений для данной проблемы, и, хотя вы можете найти улучшения, основанные на интуиции, вам будет гораздо легче это сделать, если у вас есть инструменты для профилирования, позволяющие определить проблемные области. Кроме того, вы будете довольны доказательством того, что области, которые вы улучшаете, стоят затрат времени.

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