[英]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.