试图找出我的查询缓慢的原因

Posted

技术标签:

【中文标题】试图找出我的查询缓慢的原因【英文标题】:Trying to work out why my query is sluggish 【发布时间】:2020-07-03 01:38:51 【问题描述】:

所以我在 C# 中有这个查询,大约需要 3.6 秒才能完成。

var realReviews2 = from productReview in _productReviewRepository.Table.AsEnumerable().Where(x => x.ProductId == productId)
                    join review in _reviewRepository.Table.AsEnumerable() on productReview.Id equals review.ProductReviewId
                    where productReview.IsApproved && review.PictureIds != null && review.PictureIds != ""
                                   select productReview;
                realReviews = realReviews2.ToList();

这是两个表设计

产品评论表:

审核表:

我确实有这样的 where 子句,但没有区别:

var realReviews2 = from productReview in _productReviewRepository.Table.AsEnumerable()
                    join review in _reviewRepository.Table.AsEnumerable() on productReview.Id equals review.ProductReviewId
                    where productReview.ProductId == productId && productReview.IsApproved && review.PictureIds != null && review.PictureIds != ""
                                   select productReview;

我不知道为什么它很慢,有没有人建议加快速度? 谢谢

更多信息: 两个表都有 6069 行

我也尝试了以下方法,但收到此错误消息 LINQ to Entities 不支持指定的类型成员“ProductReview”。仅支持初始化程序、实体成员和实体导航属性。

为此:

var realReviews2 = _reviewRepository.Table.Where(x =>
                    x.PictureIds != null && x.PictureIds != "" && x.ProductReview.ProductId == productId).Select(x => x.ProductReviewId).ToList();
                realReviews = _productReviewRepository.Table.Where(x => realReviews2.Contains(x.Id)).Select(x => x)
                    .ToList();

【问题讨论】:

抱歉,我们需要更多信息。表中有多少行?你有什么索引?你试过在 SSMS 中运行它吗? (假设它是 ms sql server)。如果是,请粘贴执行计划 @RodneyEllis 两个表都有 6069 行 据我所知也没有索引 .AsEnumerable() ?不要那样做 看起来在您的存储库 (sigh) 的帮助下,一切都被吸回内存,然后加入,然后查询。理想情况下,您会让这些查询在可以使用其索引和查询计划的服务器上执行。我建议通过完全传递存储库,并在没有额外抽象的情况下制定查询。然后,如果它仍然很慢,您将查看分析服务器以查看可以做些什么来加快速度 【参考方案1】:

所以我想出了我需要在 linq 中使用的查询,现在速度快了 236 毫秒

var realReviews2 = _reviewRepository.Table.Where(x =>
                    x.PictureIds != null && x.PictureIds != "").Select(x => x.ProductReviewId).ToList();
                realReviews = _productReviewRepository.Table.Where(x => realReviews2.Contains(x.Id) && x.ProductId == productId).Select(x => x)
                    .ToList();

我在错误的查询中匹配了产品 ID

【讨论】:

以上是关于试图找出我的查询缓慢的原因的主要内容,如果未能解决你的问题,请参考以下文章

Django 运行缓慢的原因

如何解决SQL Server查询速度缓慢的问题

mysql查询缓慢原因和解决方案

缓慢变化的维度 - 准确的 SQL 查询实现以检索正确的数据

Impala 分区查询运行缓慢

SQL 命令运行缓慢。需要帮助识别缓慢