postgresql 带Postgres的EF Core-与原始SQL相同的查询相比,性能较差

nwsw7zdq  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(221)

我试图用C#针对Postgres DB编写的查询来诊断确切的问题,我已经在使用Scaffold-DbContext的.NET Core WebAPI项目中生成了上下文。
我希望这两个查询的速度相似,但当我使用Postgres ODBC驱动程序或PgAdmin运行一个查询,并给出相同的结果集时,我想知道:为什么“纯SQL”版本的性能更好?

我的SQL查询:

  1. SELECT oolk.salesrep, SUM(oool.openqty)
  2. FROM public.oolookup oolk
  3. INNER JOIN public.ooorderlines oool ON oool.orderlinekey = oolk.orderlinekey
  4. WHERE oolk.salesteam = 'Team1' AND oolk.categorycode = 'Category 8'
  5. GROUP BY oolk.salesrep
  • 通过ODBC运行此查询并通过WebAPI(localhost)返回JSON结果需要:2216ms*
    C#中的“相同”查询:
  1. (from oolk in db.Oolookup
  2. join oool in db.Ooorderlines on oolk.Orderlinekey equals oool.Orderlinekey
  3. where oolk.Salesteam == "Team1"
  4. where oolk.Categorycode == "Category 8"
  5. group new { oolk, oool } by oolk.Salesrep into g
  6. select new
  7. {
  8. SalesRep = g.Key,
  9. OpenQty = g.Sum(gr => gr.oool.Openqty)
  10. }).ToList()
  • 运行此查询并通过WebAPI(localhost)返回JSON结果需要:*8353ms

当我在我的C#代码中使用DB日志时,这是一个查询,它看起来是通过查询表达式发送到我的PG数据库。

  1. 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"
  2. FROM "oolookup" AS "oolk0"
  3. INNER JOIN "ooorderlines" AS "oool0" ON "oolk0"."orderlinekey" = "oool0"."orderlinekey"
  4. WHERE ("oolk0"."salesteam" = 'Team1') AND ("oolk0"."categorycode" = 'Category 8')
  5. ORDER BY "oolk0"."salesrep"

我觉得这件事有些奇怪。首先,我从来没有指定要从数据库中选择这么多列,就像我必须使用“PlainSQL”那样。然而,他们在这里。其次,这看起来只是“真实的查询”的一半。我看不到任何“SQL”进行求和,所以我假设这是在.NET对象内部发生的,而不是在数据库中。
对于索引,我正在构建一个具有星星模式的数据仓库。因此,ooorderlines表上的join字段/主键被索引(单列),而oolookup表上的每一列都有一个索引(单列)。所以我不怀疑是索引问题在起作用。我认为这是因为我对. NET中的查询表达式缺乏经验。
6秒的差别从何而来?

gg0vcinb

gg0vcinb1#

关于添加ORDER BY -EF中存在问题,看起来无法解决https://stackoverflow.com/a/26821542/9566462
关于select中不需要的属性-您可以尝试下面的代码

  1. var neededDataQ =
  2. from oolk in db.Oolookup
  3. join oool in db.Ooorderlines
  4. on oolk.Orderlinekey equals oool.Orderlinekey
  5. where
  6. oolk.Salesteam == "Team1"
  7. &&
  8. oolk.Categorycode == "Category 8"
  9. select new {
  10. oolk.Salesrep,
  11. oool.Openqty,
  12. };
  13. var groupedDataQ =
  14. from neededData in neededDataQ
  15. group neededData by neededData.Salesrep into g
  16. select new
  17. {
  18. SalesRep = g.Key,
  19. OpenQty = g.Sum(gr => gr.Openqty)
  20. };
  21. var groupedDataList = await groupedDataQ.ToListAsync(cancellationToken);
展开查看全部

相关问题