2010-11-18 17 views
7

Tengo esta consultaconsulta lenta cuando se conecta al servidor vinculado

UPDATE linkeddb...table SET field1 = 'Y' WHERE column1 = '1234'

Esto toma 23 segundos para seleccionar y actualizar una fila

Pero si uso openquery (que no lo hacen quiero) entonces solo toma medio segundo.

La razón por la que no quiero usar openquery es para que pueda agregar parámetros a mi consulta de forma segura y estar a salvo de las inyecciones de SQL.

¿Alguien sabe de alguna razón para que funcione tan lentamente?

+0

¿Alguna pista del plan de ejecución de consultas?O puede configurar el Analizador de SQL para ver la base de datos y ver qué hace Openquery de manera diferente. – Rup

Respuesta

8

Aquí hay una idea como alternativa. Cree un procedimiento almacenado en el servidor remoto para realizar la actualización y luego llame a ese procedimiento desde su instancia local.

/* On remote server */ 
create procedure UpdateTable 
    @field1 char(1), 
    @column1 varchar(50) 
as 
    update table 
     set field1 = @field1 
     where column1 = @column1 
go 

/* On local server */ 
exec linkeddb...UpdateTable @field1 = 'Y', @column1 = '1234' 
+0

@Joe - es básicamente un procedimiento almacenado función/método para una base de datos? – orokusaki

+0

@orokusaki: Sí, puedes pensarlo de esa manera. –

+0

@Joe Esto se ejecutará solo un poco más rápido, debido a la eliminación del análisis y el tiempo de compilación. @orokusaki Aún es mejor que tu método, ya que permite que la base de datos se proteja de la inyección sql. También puede establecer permisos para que el usuario no pueda actualizar la tabla directamente, y solo puede hacerlo a través del SP. – stevenrcfox

2

¿Column1 primary key? Probablemente no. Intente seleccionar registros para actualizar utilizando la clave principal (donde PK_field = xxx), de lo contrario (¿a veces?), Todos los registros se leerán para encontrar PK para que se actualicen los registros.

+0

Estoy bastante seguro de que column1 es la clave principal, pero mirando el plan de ejecución en el Analizador de consultas SQL, muestra que el análisis remoto está tardando más, por lo que parece que está pasando por los 40,000 registros. –

+2

Hmm, si su PK es (n) varchar, entonces puede tener algún problema de colación (me refiero a que SQL no utiliza dicho índice porque no conoce la intercalación más o menos). Sin embargo, no tengo experiencia con campos PK no enteros. – Arvo

+0

@Jamie, en segundo lugar la teoría de colación de Arvo es un problema potencial – stevenrcfox

1

¿Column1 es un campo varchar? ¿Es por eso que está rodeando el valor 1234 con comillas simples? ¿O es simplemente un error en tu pregunta?

+0

Si ejecuto la consulta en el Analizador de consultas sin las comillas obtengo un error y creo que la columna1 es un campo varchar –

4

Si usted está buscando el qué, he aquí una posibilidad de Linchi Shea's Blog:

para crear los mejores planes de consulta cuando está utilizando una tabla en una servidor vinculado, el El procesador de consulta debe tener estadísticas de distribución de datos del servidor vinculado . Los usuarios que han limitado permisos en cualquier columna de la tabla podrían no tener suficientes permisos para obtener todos los útiles estadísticas, y podrían recibir Aless plan de consulta eficiente y experiencia bajo rendimiento. Si el ligado serveris una instancia de SQL Server, para obtener todas las estadísticas disponibles, el usuario debe ser propietario de la tabla o ser un miembro de la función fija de servidor sysadmin, la función de base db_ownerfixed , o la función de base fija db_ddladmin en el linkedserver.

(Debido a la publicación de Linchi, esta aclaración se ha agregado a la última documentación de BooksOnline SQL).

En otras palabras, si el servidor vinculado está configurado con un usuario que tiene permisos limitados, SQL no puede recuperar estadísticas precisas para la tabla y puede elegir un método pobre para ejecutar una consulta, incluida la recuperación de todas las filas.

Aquí hay un related SO question sobre el rendimiento de la consulta del servidor vinculado. Su conclusión fue: utilizar OpenQuery para obtener el mejor rendimiento.

Actualización: algunos additional excellent posts sobre el rendimiento del servidor vinculado desde el blog de Linchi.

Cuestiones relacionadas