sách gpt4 ăn đã đi

c# - 与 SSMS 相比,LINQ 查询非常慢

In lại 作者:太空狗 更新时间:2023-10-29 20:24:33 24 4
mua khóa gpt4 giày nike

主要问题是否存在一些已知的限制、困惑、配置问题等任何可以解释以下事实的事实:在所有条件相同的情况下,从 C# linq 运行的查询可能比以任何其他方式运行的查询花费更长的数量级才能完成?

这是 linq 中的缩写查询。它是 View 和表之间非常直接的连接。

var query = (
from content in context.ApprovedContentView
where content.BucketId == 13098 && content.ContentTypeId == 5220
join item in context.ActiveContent
on content.ContentId equals item.ItemId
Ở đâu
item.IsSuchAndSuch == true && item.SomeOtherProperty == 5000
select new
{
ItemId = item.ItemId,
Title = item.Title,
SubTitle = item.SubTitle,
DescriptionText = item.DescriptionText,
/* about 10 other scalar fields */

});

int count = query.Count();
var data = query.OrderByDescending(item => item.ItemId).Skip(5).Take(3);

这是它生成的(缩写/格式化的)SQL

LỰA CHỌN 
[GroupBy1].[A1] AS [C1]
FROM ( SELECT
COUNT(1) AS [A1]
FROM [SchemaX].[ApprovedContentView] AS [Extent1]
INNER JOIN [SchemaX].[ActiveContent] AS [Extent2] ON [Extent1].[ContentId] = [Extent2].[ItemId]
WHERE (13098 = [Extent1].[BucketId]) AND (5220 = [Extent1].[ContentTypeId ]) AND
(1 = [Extent2].[IsSuchAndSuch]) AND (5000 = [Extent2].[SomeOtherProperty ])
) AS [GroupBy1]
ĐI

SELECT TOP (3)
[Filter1].[BucketId] AS [BucketId],
[Filter1].[ItemId] AS [ItemId],
[Filter1].[Title] AS [Title],
[Filter1].[SubTitle] AS [SubTitle],
[Filter1].[DescriptionText] AS [DescriptionText],
/* other fields */
FROM ( SELECT
[Extent1].[BucketId] AS [BucketId],
[Extent2].[ItemId] AS [ItemId],
[Extent2].[Title] AS [Title],
[Extent2].[SubTitle] AS [SubTitle],
[Extent2].[DescriptionText] AS [DescriptionText],
/* other fields */
row_number() OVER (ORDER BY [Extent2].[DealId] DESC) AS [row_number]
FROM [SchemaX].[ApprovedContentView] AS [Extent1]
INNER JOIN [SchemaX].[ActiveContent] AS [Extent2] ON [Extent1].[ContentId] = [Extent2].[ItemId]
WHERE (13098 = [Extent1].[BucketId]) AND (5220 = [Extent1].[ContentTypeId ]) AND
(1 = [Extent2].[IsSuchAndSuch]) AND (5000 = [Extent2].[SomeOtherProperty ])
) AS [Filter1]
WHERE [Filter1].[row_number] > 5
ORDER BY [Filter1].[DealId] DESC

不同的场景我的速度测试基于观察使用 sql 事件探查器运行的查询

原位当此 linq 查询在我的 c# 应用程序中作为其正常操作的一部分执行时,我观察到在 sql 事件探查器中,选择计数需要整整 3 秒才能完成,而且奇怪的是,生成投影的查询只需要 200 毫秒,并且时间是可重复的,这似乎排除了查询执行计划缓存问题。(运行 Entity Framework 5,sql server 2008 r2)

在 LINQPAD 中当我通过 LinqPad 执行 linq 语句时,使用 C# 应用程序的 dll 的数据上下文,计数和投影各自在四分之一秒内完成(~224 毫秒,总运行时间为 ~450 毫秒)。

在 SSMS 中无论 sql 的来源如何,当我复制 sql 配置文件报告它执行的实际代码并将其粘贴到管理工作室窗口并执行时,大约需要 224 毫秒。

数据库调整在 SSMS 中,当我评估从探查器(从代码或从 linqpad)复制的 sql 的实际执行计划时,我发现 sql 使用了所有正确的索引,并且仅报告索引查找——没有表扫描,没有删除查找。

那么,是什么给了?有人见过这样的东西吗?

câu trả lời hay nhất

我会确保您没有为您的应用程序缓存的错误执行计划。在对已使用的数据库进行架构工作时,这种情况经常发生在我身上。可能您的应用程序执行上下文缓存了一个执行计划,但由于架构更改而效率低下,而为您的 SSMS 查询生成的执行计划是最新的,并且没有发现这些性能问题。

我会尝试使用 DBCC FREEPROCCACHE强制更新您的执行计划,看看是否可以解决问题。

关于c# - 与 SSMS 相比,LINQ 查询非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15343594/

24 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress