我有一个将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')
然后
获取结果
答案 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
。将所需的数据获取到临时表中,然后加入它们。