OPERQUERY查询,关于效率,或者说正确用法

原文:https://blog.csdn.net/u013641136/article/details/50379596

做过一个项目,需要在SQLSERVER创建对ORACLE的DBLINK然后通过OPERQUERY访问ORACLE查询记录并返回到SQLSERVER某表

ORACLE中的数据量在100W行左右,采用insert into T1(X1,X2,X3) SELECT * FROM OPENQUERY(XXXXX)的方式,效率很低,尤其是很多时候是按条件查询,只需要返回几条记录,却需要几十分钟,即便改成insert into T1(X1,X2,X3) SELECT * FROM OPENQUERY(XXXXX) where xxx 也不行。这已然超出效率慢的范畴,而是语句有问题。

后来考虑了一下,慢是因为这算是二次查询,会先将ORACLE中所有数据查询返回到OPERQUERY中,再按条件去OPERQUERY查询,提高效率的方法是将条件放入OPERQUERY中,然而条件并非一个数值,而是另一张临时表,固采用游标的方式,一条一条将临时表中的记录处理为变量,放入OPERQUERY中作为条件执行。果然不会再出现查询3条记录插入SQLSERVER却需要30分钟,只需1秒钟。
语句实例:

declare @itemid nvarchar(100)
declare auth_cur cursor for


select item_number


from erp_part_item


open auth_cur


fetch next from auth_cur into @itemid


while (@@fetch_status=0)


  begin
    DECLARE @TSQL varchar(8000)
    SELECT  @TSQL = 'insert into HISTORY_ITEM(ITEM_NUMBER,ITEM_TEMPLATE,ITEM_DESC,ITEM_UOM,UNIT_WEIGHT,ORG,FLAG,inventory) SELECT * FROM OPENQUERY(TO_ERPZS,''SELECT ITEM_NUMBER,ITEM_TYPE,ITEM_DESCRIPTION,PRIMARY_UOM_CODE,UNIT_WEIGHT,ORGANIZATION_CODE,LOT_FLAG,Inventory_Item_Status_Code from APPS.CUX_PDM_ITEMS_BOM_V where item_number =  ''''' + @itemid + ''''''')'
    EXEC (@TSQL)
    fetch next from auth_cur into @itemid
  end


close auth_cur


deallocate auth_cur

猜你喜欢

转载自www.cnblogs.com/tc310/p/11106884.html