Ve vašem prvním příkladu používajícím "tečkovou" notaci je použit stroj klientského kurzoru a většina věcí je vyhodnocována lokálně. Pokud vybíráte z velké tabulky a používáte klauzuli WHERE, záznamy budou staženy lokálně ze vzdálené databáze. Jakmile jsou data načtena přes propojený server, teprve potom se lokálně použije klauzule WHERE. Tato sekvence je často hitem výkonu. Indexy na vzdálené databázi jsou v podstatě nepoužitelné.
Alternativně při použití OPENQUERY SQL Server odešle příkaz SQL do cílové databáze ke zpracování. Během zpracování jsou využity všechny indexy na stolech. Také klauzule where se použije na straně Oracle před odesláním sady výsledků zpět na SQL Server.
Podle mých zkušeností, kromě těch nejjednodušších dotazů, vám OPENQUERY poskytne lepší výkon.
Z výše uvedených důvodů bych doporučil používat OpenQuery na vše.
Jedním z problémů při používání OpenQuery, se kterým jste se již možná setkali, jsou jednoduché uvozovky. Pokud řetězec sql odesílaný do vzdálené databáze vyžaduje jednoduché uvozovky kolem řetězce nebo data data, musí být escapovány. Jinak neúmyslně ukončí řetězec SQL.
Zde je šablona, kterou používám vždy, když se zabývám proměnnými v příkazu openquery na propojený server, abych se postaral o problém s jednou citací:
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)