gpt4 book ai didi

sql - 为什么 Entity Framework 生成的查询运行时间是直接运行相同查询的两倍?

转载 作者:行者123 更新时间:2023-12-03 03:01:20 25 4
gpt4 key购买 nike

我有一个简单的 EF 实现,其中检索约 20K 条记录并包含两个子实体:

using (InsightEntities context = new InsightEntities())
{
return context.Accounts
.Include(x => x.Division)
.Include(x => x.Division.Company)
.OrderBy(x => x.ID)
.AsNoTracking()
.ToList();
}

当我通过 SQL Profiler 分析 EF 调用时,SQL 命令的持续时间约为 1.2 秒,即使在后续调用中也是如此。但是,如果我复制并粘贴 EF 生成的相同 SQL 并直接通过 SSMS 运行它,则时间会缩短一半。

下面是 EF 调用(红色椭圆)和直接调用(绿色椭圆)的屏幕截图:

enter image description here

我知道 EF 做了很多工作,将数据映射到对象、解释关系等,但为什么单独的查询需要比直接运行相同查询的时间长两倍的时间?默认 EF 连接字符串是否有可能优化查询的更改?

(我应该补充一点,查询本身已通过所有外键的索引进行了完全优化。)

谢谢!

最佳答案

两条跟踪之间的读数相同,因此看起来与计划无关。

很可能只是因为 Entity Framework 在消耗结果集时执行更多操作,因此需要更长的时间。

例如创建以下标量 UDF

CREATE FUNCTION dbo.GetTime()
RETURNS CHAR(12)
AS
BEGIN
RETURN CONVERT(VARCHAR(12), GETDATE(), 114)
END

然后在 Management Studio 中运行

SELECT TOP (10) CAST(dbo.GetTime() AS CHAR(8000))
FROM sys.all_objects

几乎立即完成,但模拟执行更多工作的客户端

using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();

using (SqlCommand command = new SqlCommand(
@"SELECT TOP (10) CAST(dbo.GetTime() AS CHAR(8000))
FROM sys.all_objects", con))
{
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader.GetString(0).TrimEnd());
System.Threading.Thread.Sleep(1000);
}
}
}
}

在 Profiler 中显示为持续时间 8 秒。

Profiler

上面显示的运行结果是

23:55:54:870
23:55:54:870
23:55:54:870
23:55:55:870
23:55:56:870
23:55:57:870
23:55:58:870
23:55:59:870
23:56:00:870
23:56:01:870

第一行和最后一行之间的时间戳差异为 7 秒。前三行几乎立即返回,之后 SQL Server 在继续执行之前延迟等待客户端(等待类型 ASYNC_NETWORK_IO)。

关于sql - 为什么 Entity Framework 生成的查询运行时间是直接运行相同查询的两倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18364050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com