Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL 2005 - Servidor Vinculado ao Oracle Consultas Extremamente Lentos


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)