2016-03-01 72 views
0

说我有这样的查询:Oracle链接服务器太慢

create table #Incident (id int) 
insert into #Incident values (1) 

    SELECT INC_EVNT_URN,INC_CR_DTE FROM OPENQUERY(incidents, 
    'select * from incident') 

说事件有800万条记录在里面,我只想让他们的一个。 #Incident存储在SQL Server表中。事件链接服务器是一个Oracle服务器。

我不能做到这一点:

select * from #Incident INNER JOIN (
SELECT ID FROM OPENQUERY(incidents, 
'select * from incident') 
) AS Incident ON #Incident.ID=Incidentid 

我不能这样做的原因是因为它需要大约一天运行,因为它首先获取所有从Oracle数据库中的事件发现,我需要一个之前。有没有一种方法来重构查询,使其更有效率?

回答

1

这实际上不是一个SQL Server少一个Oracle问题。 OPENQUERY直接针对链接数据库运行第二个参数中标识的SQL脚本并返回结果。因此,“链接服务器”真的是那种一个用词不当,因为你真的只是做一个孤立的数据库调用,而不是引用在当前的查询计划异物。所以每次你参考

OPENQUERY(incidents,'select * from incident') 

你拉在所有8亿条记录这一事件表到高速缓存中,然后运行针对巨大的临时表的SQL Server查询。

为了避免这种情况,你会想缩小您发送到Oracle服务器的查询,以便Oracle解析器可以运行一个更清洁的计划。看看这个link描述变量传递到OPENQUERY

通基本价值观

当基本Transact-SQL语句是已知的,但你必须在一个或多个特定值,使用代码是类似于 通过 下面的示例:

DECLARE @TSQL varchar(8000), @VAR char(2) 
     SELECT @VAR = 'CA' 
     SELECT @TSQL = 'SELECT * FROM OPENQUERY(MyLinkedServer,''SELECT * FROM pubs.dbo.authors WHERE state = ''''' + @VAR + ''''''')' 
     EXEC (@TSQL) 

利用这些信息,我会尝试通过在案发ID你正在寻找。然后,所有的工作都在Oracle中进行,您只需要撤回所需的数据(而不是整个表)。