使用Postgres的EF Core - 与原始SQL相同的查询相比性能较差

时间:2018-01-30 13:55:03

标签: c# postgresql performance entity-framework group-by

我正在尝试使用我在C#中针对Postgres数据库编写的查询来诊断确切的问题,我使用Scaffold-DbContext在.NET Core WebAPI项目中生成了上下文。

我期望两个查询的速度相似,但是当我使用Postgres ODBC驱动程序或PgAdmin运行一个给我相同结果集的查询时,我想知道:为什么“纯SQL”版本执行如此好多了?

我在SQL中的查询:

SELECT oolk.salesrep, SUM(oool.openqty) 
FROM public.oolookup oolk 
INNER JOIN public.ooorderlines oool ON oool.orderlinekey = oolk.orderlinekey 
WHERE oolk.salesteam = 'Team1' AND oolk.categorycode = 'Category 8'
GROUP BY oolk.salesrep

通过ODBC运行此查询并通过WebAPI(localhost)将结果作为JSON返回需要: 2216ms

C#中的“相同”查询:

(from oolk in db.Oolookup
 join oool in db.Ooorderlines on oolk.Orderlinekey equals oool.Orderlinekey
 where oolk.Salesteam == "Team1"
 where oolk.Categorycode == "Category 8"
 group new { oolk, oool } by oolk.Salesrep into g
 select new
 {
     SalesRep = g.Key,
     OpenQty = g.Sum(gr => gr.oool.Openqty)
 }).ToList()

运行此查询并通过WebAPI(localhost)将结果作为JSON返回需要: 8353ms

当我在C#代码中使用数据库日志记录时,这是一个查询似乎通过查询表达式发送到我的PG数据库。

SELECT "oolk0"."pk_oolookup", "oolk0"."categorycode", "oolk0"."customercode", "oolk0"."customerdiv", "oolk0"."customergroup", "oolk0"."forecastgroup", "oolk0"."orderclass", "oolk0"."orderkey", "oolk0"."orderlinekey", "oolk0"."productcode", "oolk0"."saleslocation", "oolk0"."salesrep", "oolk0"."salesteam", "oolk0"."shippinglocation", "oool0"."orderlinekey", "oool0"."openamount", "oool0"."openappliedheadercharges", "oool0"."openitemamount", "oool0"."openlinechargeamount", "oool0"."openqty", "oool0"."openvolume", "oool0"."openweight", "oool0"."totalamount", "oool0"."totalheaderchargeamount", "oool0"."totalitemamount", "oool0"."totalqty", "oool0"."totalvolume", "oool0"."totalweight"
FROM "oolookup" AS "oolk0"
INNER JOIN "ooorderlines" AS "oool0" ON "oolk0"."orderlinekey" = "oool0"."orderlinekey"
WHERE ("oolk0"."salesteam" = 'Team1') AND ("oolk0"."categorycode" = 'Category 8')
ORDER BY "oolk0"."salesrep"

我发现了一些有关这种奇怪的事情。首先,我从未指定我想从数据库中选择这么多列,就像我必须使用“Plain SQL”一样。然而,他们在这里。其次,这看起来只是“真实查询”的一半。我看不到任何进行求和的“SQL”,所以我认为这是在.NET对象内部而不是数据库中发生的。

对于索引,我正在构建一个带有星型模式的数据仓库。因此,ooorderlines表上的连接字段/主键被索引(单列),并且我的oolookup表上的每一列都有一个索引(单列)。所以我不怀疑索引问题在起作用。我正在研究我对.NET中查询表达式的经验不足。

六秒之内的差异来自哪里?

0 个答案:

没有答案