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