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本库里的关连查询了,所以速度加快很多

posted on 2011-09-20 18:20  敏而好学  阅读(768)  评论(0编辑  收藏  举报