В първия ви пример, използвайки нотация "точка", се използва механизмът на клиентския курсор и повечето неща се оценяват локално. Ако избирате от голяма таблица и използвате клауза WHERE, записите ще бъдат изтеглени локално от отдалечената база данни. След като данните бъдат изтеглени през свързания сървър, само тогава клаузата WHERE се прилага локално. Често тази последователност е хит в изпълнението. Индексите на отдалечената база данни са основно безполезни.
Като алтернатива, когато използвате OPENQUERY, SQL Server изпраща sql израза към целевата база данни за обработка. По време на обработката всички индекси на таблиците се използват. Също така клаузата where се прилага от страна на Oracle, преди да изпрати набора от резултати обратно към SQL Server.
Според моя опит, с изключение на най-простите заявки, OPENQUERY ще ви даде по-добра производителност.
Бих препоръчал да използвате OpenQuery за всичко поради горните причини.
Една от болните точки при използване на OpenQuery, която може би вече сте срещали, са единичните кавички. Ако sql низът, който се изпраща към отдалечената база данни, изисква единични кавички около низ или дата, те трябва да бъдат екранирани. В противен случай те неволно прекратяват sql низа.
Ето един шаблон, който използвам винаги, когато работя с променливи в оператор за отворена заявка към свързан сървър, за да се погрижа за проблема с единичните кавички:
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)