简体   繁体   English

两个链接服务器中连接两个数据库时的查询

[英]Query in Joining Two Databases in Two Linked Server

i have a query which joins Microsoft and Oracle (as Linked) but this query takes long time (more than 1 hour).我有一个加入 Microsoft 和 Oracle 的查询(作为链接),但这个查询需要很长时间(超过 1 小时)。 but I run every joins separately, does not took long ( less than 10sec each).但我单独运行每个连接,不需要很长时间(每个不到 10 秒)。 Is there any way I can re-do the query.有什么办法可以重新查询。 eg running different part of query then getting a combined result.例如,运行查询的不同部分,然后得到一个组合结果。

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

I want to run separately我想单独跑

SELECT A.NAME, A.NMR FROM ALPHA A

then然后

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

then然后

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

then然后

get the result得到结果

I would try to load each result from the OPENQUERY's into their own temp tables and then join the temp tables to the "local" table.我会尝试将 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

I'm not sure how much of a performance improvment it will be but can try using a CTE.我不确定性能会提高多少,但可以尝试使用 CTE。 Part of me thinks this will do the exact same thing but if you are saying they all run faster separately maybe it will help.我的一部分认为这会做完全相同的事情,但如果你说它们都单独运行得更快,也许它会有所帮助。

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

I'm not sure I quite follow the question, but it's true that cross-server joins tend to be very inefficient.我不确定我是否完全遵循这个问题,但确实跨服务器连接往往效率很低。 Probably your best approach would be to SELECT the subset of data you need from the remote server into a local temporary table, then JOIN to the temporary table.可能您最好的方法是将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

The main point is to avoid running the JOIN across servers.要点是避免跨服务器运行JOIN Get the data you need into temporary tables and join to them instead.将您需要的数据放入临时表中,然后加入它们。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM