咸土豆超人 2020-04-09 14:32 采纳率: 100%
浏览 260
已采纳

关于网页在ef框架下,查询数据库效率的疑惑

因为是纯新手,第一次写项目,而且还是接手别人的程序,所以本着一致的原则(其实是因为别的也不大会,为了不抓瞎,就照着他给的写了),在写一个比较复杂的查询(oracle数据库)时(查询一个近40个字段(部分为空),几百万条数据的表,并且需要join两个几百条的小表,并根据相关条件筛选),使用了项目里原来是用的linq语句—>他写了一个函数,先返回了并表后的结果(iqueryable),再对iqueryable的结果用.where进行筛选。我在他的框架下先join并表,再查询,看到下面控制台显示进行数据库查询、出现sql语句的时候,是我把iqueryable的查询结果tolist的时候。
** 疑问1:为什么会是在tolist的时候才查询,是因为优化的机制么?还是什么其他原因?**

在测试端,因为本地库数据较少,所以查询的时候还是比较快速的,大概就是10秒左右(真的是纯新手。。我还以为这么复杂的查询大概就是这么慢),然后我就放到这正式环境。结果,10-20分钟才能查询出相应的结果。。。我当时就有点儿崩溃。

后来听同事说是ef的问题,我就一狠心,直接写sql语句,然后在
    using(sqlcontext context =new sqlcontext){}下,
    (sqlcontext为继承dbContext写的类,context为新声明的数据库连接)
    用context.Database.SqlQuery<“类名DTO”>(queryline,query_paramter)
    (queryline为string类型的sql语句,自己拼的,query_paramter为oracleparameter类型的查询变量)
    查询,同时在正式环境数据库加了一些索引,在正式环境上一测试,嚯,5秒解决问题,我当时就感觉,wc,这啥啊,咋么可以这么快?

我还观察了一下输出端展示的查询数据库的sql语句,使用linq显示的sql和单纯我自己写的的sql在正式环境数据库上(oracle)用f5看跑的效率,相差很小,甚至可以说就在伯仲之间,真是让人摸不着头脑。

后来想了想是否可能是以下几个原因导致的?
1.在原框架下,有些查询语句不好写,所以有些查询条件是我在tolist以后进行筛选和处理的,tolist是不是会占用比较多的资源?每个tolist的筛选是不是相当于在去数据库中查询一遍?但是初步查询后,基本上也就是1000条以下的数据,再怎么tolist查询筛选的话应该不会太占用资源吧?

** 疑问2:tolist再查询会不会再去访问数据库?还是在网页布设的服务器上进行的运算?因为我在开发测试端跑f11时就发现每次跑到tolist语句或者iqueryable.count()的时候就会有比较明显的卡顿,这里的机制不大明白。**

2.索引的问题,正式环境数据库之前并没有小表索引,以及大表join相关字段的索引,这部分可能会影响性能。
3.那就是linq语句和单纯sql有着比较明显的差别?后台机制问题?这里实在是不知道怎么去说了,大概是,天生的缺陷么?就是要慢一点?

** 疑问3:linq和单纯的sql的执行效率真的差别很大么?**

希望大家能给我指点迷津,百度搜索学习什么的让我有点崩溃。。。可能我这样的情况比较少吧,找不到合适的解答,第一次在这里发帖,非常感谢大家能抽出时间看我写的问题,希望大家共同努力!加油!
  • 写回答

1条回答 默认 最新

  • threenewbee 2020-04-10 09:54
    关注

    tolist会执行asenumerable,这个操作会立刻执行sql

    linq to sql是iqueryable,不执行,延迟到asenumerable执行,linq to objects在内存中操作

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿