Em seu primeiro exemplo usando a notação "ponto", o mecanismo de cursor do cliente é usado e a maioria das coisas é avaliada localmente. Se você estiver selecionando em uma tabela grande e usando uma cláusula WHERE, os registros serão retirados localmente do banco de dados remoto. Uma vez que os dados tenham sido puxados através do servidor vinculado, somente então a cláusula WHERE é aplicada localmente. Muitas vezes, essa sequência é um sucesso de desempenho. Índices no banco de dados remoto são basicamente inúteis.
Como alternativa, quando você usa OPENQUERY, o SQL Server envia a instrução sql para o banco de dados de destino para processamento. Durante o processamento, quaisquer índices nas tabelas são aproveitados. Além disso, a cláusula where é aplicada no lado do Oracle antes de enviar o conjunto de resultados de volta ao SQL Server.
Na minha experiência, exceto para as consultas mais simples, OPENQUERY fornecerá um desempenho melhor.
Eu recomendaria usar o OpenQuery para tudo pelos motivos acima.
Um dos pontos problemáticos ao usar o OpenQuery que você já pode ter encontrado são as aspas simples. Se a string sql que está sendo enviada para o banco de dados remoto exigir aspas simples em torno de uma string ou data, elas precisam ser escapadas. Caso contrário, eles encerram inadvertidamente a string sql.
Aqui está um modelo que eu uso sempre que estou lidando com variáveis em uma instrução openquery para um servidor vinculado para cuidar do problema de aspas simples:
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)