W pierwszym przykładzie z notacją "kropkową" używany jest silnik kursora klienta i większość rzeczy jest oceniana lokalnie. Jeśli wybierasz z dużej tabeli i używasz klauzuli WHERE, rekordy zostaną ściągnięte lokalnie ze zdalnej bazy danych. Gdy dane zostaną ściągnięte przez połączony serwer, tylko wtedy klauzula WHERE jest stosowana lokalnie. Często ta sekwencja jest hitem wydajności. Indeksy w zdalnej bazie danych są w zasadzie bezużyteczne.
Alternatywnie, gdy używasz OPENQUERY, SQL Server wysyła instrukcję sql do docelowej bazy danych w celu przetworzenia. Podczas przetwarzania wszelkie indeksy w tabelach są lewarowane. Również klauzula where jest stosowana po stronie Oracle przed wysłaniem zestawu wyników z powrotem do SQL Server.
Z mojego doświadczenia wynika, że oprócz najprostszych zapytań, OPENQUERY zapewni lepszą wydajność.
Polecam używać OpenQuery do wszystkiego z powyższych powodów.
Jednym z problemów podczas korzystania z OpenQuery, z którym już się zetknąłeś, są pojedyncze cudzysłowy. Jeśli ciąg sql wysyłany do zdalnej bazy danych wymaga pojedynczych cudzysłowów wokół ciągu lub daty daty, należy je zmienić. W przeciwnym razie nieumyślnie kończą ciąg sql.
Oto szablon, którego używam za każdym razem, gdy mam do czynienia ze zmiennymi w instrukcji openquery do połączonego serwera, aby rozwiązać problem pojedynczego cudzysłowu:
DECLARE @UniqueId int
, @sql varchar(500)
, @linkedserver varchar(30)
, @statement varchar(600)
SET @UniqueId = 2
SET @linkedserver = 'LINKSERV'
SET @sql = 'SELECT DummyFunction(''''' + CAST(@UniqueId AS VARCHAR(10))+ ''''') FROM DUAL'
SET @statement = 'SELECT * FROM OPENQUERY(' + @linkedserver + ', '
SET @Statement = @Statement + '''' + @SQL + ''')'
EXEC(@Statement)