在两个链接服务器中联接两个数据库中的查询

时间:2019-10-03 15:50:53

标签: sql sql-server

我有一个将Microsoft和Oracle连接起来的查询(如链接所示),但是此查询需要很长时间(超过1小时)。但是我分别运行每个连接,并没有花费很长时间(每个连接少于10秒)。有什么办法可以重做查询吗?例如运行查询的不同部分,然后获得合并结果。

SampleDate

我想单独跑步

SELECT A.NAME, A.NMR, B.ADDRESS, C.TEL
FROM ALPHA A

LEFT JOIN (SELECT ADDRESS, NMR FROM OPENQUERY(ORCA, 'SELECT ADDRESS, NMR FROM tblADDRESS') B ON B.NMR = A.NMR

LEFT JOIN (SELECT TEL, NMR FROM OPENQUERY(ORCT, 'SELECT TEL, NMR FROM tblTEL') C ON C.NMR = A.NMR

然后

SELECT A.NAME, A.NMR FROM ALPHA A

然后

SELECT TEL, NMR FROM OPENQUERY(ORCT, 'SELECT TEL, NMR FROM tblTEL')

然后

获取结果

3 个答案:

答案 0 :(得分:2)

我会尝试将OPENQUERY的每个结果加载到它们自己的临时表中,然后将这些临时表连接到“本地”表中。

SELECT 
    ADDRESS
    ,NMR 
INTO #ORCA 
FROM 
    OPENQUERY(ORCA, 'SELECT ADDRESS, NMR FROM tblADDRESS')

SELECT 
    TEL
    ,NMR
INTO #ORCT
FROM 
    OPENQUERY(ORCT, 'SELECT TEL, NMR FROM tblTEL')

SELECT 
    A.NAME
    ,A.NMR
    ,ORCA.ADDRESS
    ,ORCT.TEL
FROM
    ALPHA A

        LEFT JOIN #ORCA ORCA
        ON A.NMR = ORCA.NMR

        LEFT JOIN #ORCT ORCT
        ON A.NMR = ORCT.NMR

答案 1 :(得分:1)

我不确定会有多少性能改进,但是可以尝试使用CTE。我的一部分认为这会做完全相同的事情,但是如果您说它们都单独运行得更快,也许会有所帮助。

with data1 as (SELECT A.NAME, A.NMR FROM ALPHA A),
data2 as(SELECT ADDRESS, NMR FROM OPENQUERY(ORCA, 'SELECT ADDRESS, NMR FROM tblADDRESS'),
data3 as(SELECT TEL, NMR FROM OPENQUERY(ORCT, 'SELECT TEL, NMR FROM tblTEL')

SELECT A.NAME, A.NMR, B.ADDRESS, C.TEL
FROM data1 A
left join data2 B ON B.NMR = A.NMR
left join data3 C ON C.NMR = A.NMR

答案 2 :(得分:1)

我不确定我是否完全遵循这个问题,但是确实跨服务器联接的效率很低。最好的方法可能是将您需要的数据子集从远程服务器SELECT到本地临时表,然后JOIN到临时表。

select * into #remoteAddress from openquery (orca, 'select id, address, nmr from tblAddress');
select * into #remoteTelephone from openquery (orcb, 'select tel, nmr from tblTel');
select a.name, a.nmr, b.address, c.tel
 from alpha a
 left join #remoteAddress b
  on a.nmr = b.nmr
 left join #remoteTelephone c
  on a.nmr = c.nmr

主要要点是避免在服务器之间运行JOIN。将所需的数据获取到临时表中,然后加入它们。

相关问题