2016-10-07 6 views
1

У меня возникла проблема с объединением локальных таблиц и связанных таблиц серверов. Я могу сделать это, просто используя внутренние соединения, но это заставляет меня слишком долго выполнять запрос. Я знаю, что есть способ сделать это с помощью OPENQUERY, но я не могу это получить.Связанные серверы и локальные таблицы присоединяются

Вот что я делал в начале:

SELECT DISTINCT 
       local.L_ID 
FROM dbo.local_table AS local 
INNER JOIN [server].[db].[dbo].[TB_TEST] as ts 
    on local.L_ID = ts.L_ID 
LEFT JOIN [server].[db].[dbo].[TB_EXE] as ex 
    on ts.A_ID = ex.T_ID 

Теперь я пытаюсь сделать это:

SELECT DISTINCT 
       local.L_ID 
FROM dbo.local_table AS local 
INNER JOIN (
    SELECT * 
    FROM OPENQUERY(SERVER,'SELECT L_ID FROM TB_TEST' 
    ) ts 
    on local.L_ID = ts.L_ID 
left join OPENQUERY(SERVER,'SELECT T_ID FROM TB_EXE') ex 
    on ts.A_ID = ex.T_ID 

Можете ли вы помочь мне сделать это правильный путь, так что запрос выполняется быстрее ?

+0

Невозможно улучшить соединение на связанном сервере, если объем данных большой. Рассмотрим уменьшение объема данных с одной стороны. Старая версия SQL Server плохо связана с подключением к серверу. Какую версию SQL Server вы используете? – qxg

ответ

1

Этот тип запросов (со связанными серверами) может быть медленным из-за плохого подключения текущего экземпляра к другому или если на одном из серверов используется более старая версия SQL Server. Больше информации в этом article.

Я рекомендую вам использовать временные таблицы:

SELECT * 
INTO #ts 
FROM OPENQUERY(SERVER,'SELECT L_ID FROM TB_TEST;') 

SELECT * 
INTO #ex 
FROM OPENQUERY(SERVER,'SELECT T_ID FROM TB_EXE;') 

SELECT DISTINCT 
       l.L_ID 
FROM dbo.local_table AS l 
INNER JOIN #ts 
    on l.L_ID = ts.L_ID 
LEFT JOIN #ex 
    on ts.A_ID = ex.T_ID 

DROP TABLE #ts 
DROP TABLE #ex 

О вашем запросе.

Вы используете почти правильный синтаксис. Попробуйте нравится:

SELECT DISTINCT 
       local.L_ID 
FROM dbo.local_table AS local 
INNER JOIN (
    SELECT * 
    FROM OPENQUERY(SERVER,'SELECT L_ID FROM TB_TEST;') 
    ) ts 
    on local.L_ID = ts.L_ID 
left join (
    SELECT * 
    FROM OPENQUERY(SERVER,'SELECT T_ID FROM TB_EXE;') 
    ) ex 
    on ts.A_ID = ex.T_ID 

Или:

SELECT DISTINCT 
       local.L_ID 
FROM dbo.local_table AS local 
INNER JOIN OPENQUERY(SERVER,'SELECT L_ID FROM TB_TEST;') ts 
    on local.L_ID = ts.L_ID 
left join OPENQUERY(SERVER,'SELECT T_ID FROM TB_EXE;') ex 
    on ts.A_ID = ex.T_ID 

Также обратите внимание, что вы используете LEFT JOIN с третьей таблицы и не использовать его вообще.

+0

Спасибо! Я использую третью таблицу, чтобы показать столбец, который существует только в нем. –