sqlserver连oracle之sql优化随笔
系统要和其他系统对接,之前是通过ETL将其他系统中数据抽取到中间库(sqlserver)中,客户不希望有这个抽取延时,希望数据是实时的,没办法只好去连接对方生产镜像库(oracle),通过连接服务器的方式访问oracle每个查询都要用到openquery,整个系统改动量不小,遂将所有oracle表通过视图的方式引入,这样原有SQL就不用改动了。
其中有这样一个查询
select * from TSAcceptedBase where UserID = 4564 and trusteeTaskNo is not null and trusteeTaskNo <> '' and trusteeTaskNo NOT IN ( select MissionID from PWMission )
PWMission是连接oracle表创建的一个视图, 执行这个查询需要用6S+的时间,起初很费解,单执行
select MissionID from PWMission
一共就1600多条数据,很快,几乎瞬间,
单执行
select * from TSAcceptedBase where UserID = 4564 and trusteeTaskNo is not null and trusteeTaskNo <> ''
一共30多条数据,也很快,起初以为是not in 的缘故,起初把重心放到优化not in上,不太管用,后来想了想就算是not in这么小的数据量也不该这么久啊
久思之后想出了如下方案
SELECT MISSIONID INTO #test FROM PWMission select * from TSAcceptedBase where UserID = 4564 and trusteeTaskNo is not null and trusteeTaskNo <> '' and trusteeTaskNo NOT IN (SELECT * from #test )
执行结果为0.4S,感觉这个方案还是可以接受的。此方案的改动仅仅是加了一张临时表,不过此临时表意义非凡,通过实际执行结果我认为瓶颈在于trusteeTaskNo 字段
到ORACLE库中进行表扫描, 所以先将整个PWMission 的数据插入到sqlserver临时表中,之后在做同样查询,这样就是sqlserver本库里的关连查询了,所以速度加快很多