2009-09-01 21 views
9

Tengo varias bases de datos en una sola instancia de SQL Server 2005. He creado un sinónimo en una base de datos para acceder a una tabla en otra base de datos y cuando escribo mis consultas, me gustaría utilizar un índice específico, sin embargo, al evaluar el plan de ejecución, no parece usarlo. Si escribo la consulta para acceder a la base de datos explícitamente, funciona, pero parece que no puedo hacer que funcione usando un sinónimo. Por ejemplo:SQL Server Tabla de sinónimos con índices

select * 
from testdb..testtable with (index(testindex)) 

|--Nested Loops(Inner Join, OUTER REFERENCES:([testdb].[dbo].[testtable].[id])) 
    |--Index Scan(OBJECT:([testdb].[dbo].[testtable].[testindex])) 
    |--Clustered Index Seek(OBJECT:([testdb].[dbo].[testtable].[PK_testtable]), SEEK:([testdb].[dbo].[testtable].[id]=[testdb].[dbo].[testtable].[id]) LOOKUP ORDERED FORWARD) 

no produce el mismo plan de ejecución como

select * 
from testdb_synonym with (index(testindex)) 

|--Clustered Index Scan(OBJECT:([testdb].[dbo].[testtable].[PK_testtable])) 

Es esto una limitación con sinónimos o hay algo especial que deba hacer para conseguir que esto funcione?

+1

¿Podría publicar planes subyacentes para ambas consultas? Simplemente ejecute 'SET SHOWPLAN_TEXT ON GO SELECT ...' – Quassnoi

+0

He actualizado la descripción para incluir el plan de ejecución ... –

Respuesta

1

He probado lo mismo y parece que el optimizador de consultas ignora esa sugerencia cuando se hace a través de un sinónimo. Los detalles son: seleccioné * en comparación con una tabla arbitraria con una sugerencia de índice para usar un índice no agrupado. Sin el sinónimo, hace una búsqueda de marcador/unión de bucle anidado. Con él, realiza un escaneo de tabla. Como no hay opciones en la sintaxis de creación de sinónimos, solo puedo suponer que la sugerencia de índice se ignora. No hay detalles en BOL sobre por qué. Lo atribuiría como una "característica".

+0

Esperaba que ese no fuera el caso ... Se ha promocionado como una función de aliasing con parte del beneficio de ello para simplificar la notación de puntos.Puedo entender si iba contra un servidor remoto, pero si es un servidor local, esperaba que fuera lo suficientemente inteligente como para aprovechar los beneficios inherentes. –

0

¿Necesita la pista en su caso? Las recomendaciones de MS son para evitar sugerencias de índice si es posible debido a que pueden invalidar un plan más optimizado. Incluso si está optimizado hoy puede ser inefficiens mañana debido a la carga de datos, etc.

Traté de usar un sinónimo sin la pista en SQL Server 2008 y obtuve el mismo plan de ejecución con el sinónimo que con el nombre completo (database.schema.table).

Incluso intenté usar el sinónimo con una sugerencia de índice y forcé con éxito una búsqueda de índice no agrupado (y una búsqueda de clave para obtener el resto de los datos), y obtuve el mismo plan de ejecución con nombre completo.

¿Están actualizadas sus estadísticas? ¿Tiene un índice selectivo o el servidor SQL piensa que es más eficiente usar un escaneo de tabla?

1

WITH INDEX consejos parece ser ignorado por los sinónimos.

CREATE SYNONYM syn_master FOR master 

SELECT * 
FROM syn_master WITH (INDEX (wow_i_can_write_everything_here)) 

compila y ejecuta Allright a pesar de que no tengo un índice llamado wow_i_can_write_everything_here en mi esquema.

+0

Ya no es cierto para SQL Server 2008 R2. Por cierto: está creando un sinónimo para el DB maestro, no creo que eso funcione (seleccione * del maestro ??). –

5

Este es un error que Microsoft ha fijado: ver MS KB 963684

En Microsoft SQL Server 2005, crear un sinónimo de una mesa. Ejecuta una consulta contra el sinónimo. La consulta utiliza la sugerencia del optimizador de ÍNDICE para forzar un índice. Si examina el plan de ejecución que se genera para la consulta, , puede encontrar que el plan de ejecución no usa el índice forzado .

Cuestiones relacionadas