2016-10-07 3 views
1

Ich habe ein Problem beim Verknüpfen von lokalen Tabellen und verknüpften Servertabellen. Ich kann es nur mithilfe innerer Joins tun, aber es dauert mich zu lange, um die Abfrage auszuführen. Ich weiß, es gibt einen Weg, es mit OPENQUERY zu tun, aber ich kann es nicht bekommen.Verknüpfte Server und lokale Tabellen beitreten

Hier ist, was ich am Anfang zu tun:

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 

Jetzt versuche ich, dies zu tun:

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 

Können Sie mir helfen, dies richtig tun, um die Abfrage schneller läuft ?

+0

Es gibt keine Möglichkeit, den Verbindungsserver zu verbessern, wenn das absolute Datenvolumen groß ist. Berücksichtigen Sie das Datenvolumen auf einer Seite. Die alte Version von SQL Server ist in Bezug auf die Verbindung zum Verbindungsserver fehlerhaft. Welche Version von SQL Server verwenden Sie? – qxg

Antwort

1

Diese Art von Abfrage (mit verbundenen Servern) möglicherweise langsam wegen einer schlechten Verbindung der aktuellen Instanz zu einem anderen oder wenn auf einem der Server ältere Version von SQL Server verwendet wird. Weitere Informationen hierzu finden Sie unter article.

Ich empfehle Ihnen, temporäre Tabellen zu verwenden:

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 

Über Ihre Abfrage.

Sie verwenden fast die richtige Syntax. Versuchen Sie es mögen:

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 

Oder:

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 

Beachten Sie auch, dass Sie LINKE mit dritten Tabelle JOIN verwenden und es nicht überhaupt.

+0

Danke! Ich verwende die dritte Tabelle, um eine Spalte anzuzeigen, die nur darin existiert. –