Nel tuo primo esempio utilizzando la notazione "punto", viene utilizzato il motore del cursore del client e la maggior parte delle cose viene valutata localmente. Se stai selezionando da una tabella di grandi dimensioni e utilizzando una clausola WHERE, i record verranno estratti localmente dal db remoto. Una volta che i dati sono stati trasferiti attraverso il server collegato, solo allora la clausola WHERE viene applicata localmente. Spesso questa sequenza è un successo per le prestazioni. Gli indici sul db remoto sono sostanzialmente resi inutili.
In alternativa, quando si usa OPENQUERY, SQL Server invia l'istruzione sql al database di destinazione per l'elaborazione. Durante l'elaborazione vengono sfruttati tutti gli indici sulle tabelle. Anche la clausola where viene applicata sul lato Oracle prima di inviare il set di risultati a SQL Server.
Nella mia esperienza, ad eccezione delle query più semplici, OPENQUERY ti darà prestazioni migliori.
Consiglierei di utilizzare OpenQuery per tutto per i motivi di cui sopra.
Uno dei punti deboli dell'utilizzo di OpenQuery che potresti aver già riscontrato sono le virgolette singole. Se la stringa sql inviata al db remoto richiede virgolette singole attorno a una stringa o una data, è necessario eseguire l'escape. Altrimenti terminano inavvertitamente la stringa sql.
Ecco un modello che utilizzo ogni volta che ho a che fare con variabili in un'istruzione openquery su un server collegato per occuparmi del problema delle virgolette singole:
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)