因为是纯新手,第一次写项目,而且还是接手别人的程序,所以本着一致的原则(其实是因为别的也不大会,为了不抓瞎,就照着他给的写了),在写一个比较复杂的查询(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的执行效率真的差别很大么?**
希望大家能给我指点迷津,百度搜索学习什么的让我有点崩溃。。。可能我这样的情况比较少吧,找不到合适的解答,第一次在这里发帖,非常感谢大家能抽出时间看我写的问题,希望大家共同努力!加油!