2010-08-26 22 views
6

En mi servidor SQL 2005, tengo un servidor vinculado que se conecta a Oracle a través del proveedor OraOLEDB.Oracle.SQL 2005 - El servidor vinculado a las consultas de Oracle es extremadamente lento

Si ejecuta una consulta a través del identificador de 4 partes de este modo:

SELECT * FROM [SERVER]...[TABLE] WHERE COLUMN = 12345 

Se tarda más de un minuto en completarse. Si ejecuto la misma consulta de esta manera:

SELECT * FROM OPENQUERY(SERVER, 'SELECT * FROM TABLE WHERE COLUMN = 12345') 

Se completa al instante. ¿Hay alguna configuración que me falta en algún lugar para que la primera consulta se ejecute en un período decente? ¿O estoy atrapado usando openquery?

Respuesta

10

En su primer ejemplo con notación "punto", se utiliza el motor de cursor del cliente y la mayoría de las cosas se evalúan localmente. Si selecciona desde una tabla grande y utiliza una cláusula WHERE, los registros se reducirán localmente desde el archivo db remoto. Una vez que los datos se han transferido a través del servidor vinculado, solo entonces se aplica localmente la cláusula WHERE. A menudo esta secuencia es un golpe de rendimiento. Los índices en el db remoto básicamente se vuelven inútiles.

De forma alternativa, cuando usa OPENQUERY, SQL Server envía la instrucción sql a la base de datos de destino para su procesamiento. Durante el procesamiento, cualquier índice de las tablas se aprovecha. También la cláusula where se aplica en el lado de Oracle antes de enviar el conjunto de resultados a SQL Server.

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

Recomendaría usar OpenQuery para todo por los motivos anteriores.

Uno de los puntos fuertes al utilizar OpenQuery que ya puede haber encontrado es comillas simples. Si la cadena sql que se envía al db remoto requiere comillas simples alrededor de una cadena o fecha de fecha, deben escaparse. De lo contrario, terminan inadvertidamente la cadena sql.

Aquí es una plantilla que utilizo cuando estoy frente a las variables en una declaración openquery a un servidor vinculado a cuidar el único problema cita:

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) 
Cuestiones relacionadas