sql >> Base de Datos >  >> RDS >> Sqlserver

SQL 2005 - Servidor vinculado a consultas de Oracle extremadamente lento

En su primer ejemplo que usa la notación de "punto", se usa el motor de cursor del cliente y la mayoría de las cosas se evalúan localmente. Si está seleccionando de una tabla grande y usando una cláusula WHERE, los registros se extraerán localmente desde la base de datos remota. Una vez que los datos se han extraído del servidor vinculado, solo entonces se aplica la cláusula WHERE localmente. A menudo, esta secuencia es un éxito de rendimiento. Los índices en la base de datos remota básicamente se vuelven inútiles.

Alternativamente, cuando usa OPENQUERY, SQL Server envía la instrucción sql a la base de datos de destino para su procesamiento. Durante el procesamiento, se aprovechan los índices de las tablas. Además, la cláusula where se aplica en el lado de Oracle antes de enviar el conjunto de resultados de vuelta a SQL Server.

En mi experiencia, a excepción de las consultas más simples, OPENQUERY le brindará un mejor rendimiento.

Recomendaría usar OpenQuery para todo por las razones anteriores.

Uno de los puntos débiles al usar OpenQuery que quizás ya haya encontrado son las comillas simples. Si la cadena sql que se envía a la base de datos remota requiere comillas simples alrededor de una cadena o una fecha, deben escaparse. De lo contrario, inadvertidamente terminan la cadena sql.

Aquí hay una plantilla que uso cada vez que trato con variables en una declaración de consulta abierta a un servidor vinculado para solucionar el problema de las comillas 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)