Запрос на объединение двух баз данных в два связанных сервера - PullRequest
0 голосов
/ 03 октября 2019

У меня есть запрос, который объединяет Microsoft и Oracle (как связанные), но этот запрос занимает много времени (более 1 часа). но я запускаю каждое соединение отдельно, это не занимает много времени (менее 10 секунд каждое). Есть ли способ, которым я могу повторно выполнить запрос. Например, выполнение другой части запроса и получение комбинированного результата.

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')

, затем

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

затем

получить результат

Ответы [ 3 ]

2 голосов
/ 03 октября 2019

Я бы попытался загрузить каждый результат из ОТКРЫТИЯ в их собственные временные таблицы, а затем соединить временные таблицы с «локальной» таблицей.

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 голос
/ 03 октября 2019

Я не уверен, что полностью слежу за этим вопросом, но это правда, что межсерверные объединения имеют тенденцию быть очень неэффективными. Вероятно, наилучшим подходом было бы 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 на разных серверах. Получите необходимые данные во временные таблицы и присоединитесь к ним.

1 голос
/ 03 октября 2019

Я не уверен, насколько сильно это улучшит производительность, но могу попробовать использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...