2009-07-10 18 views
8

parece ser bastante aceptado que la inclusión del propietario del esquema de la consulta aumenta el rendimiento db, por ejemplo .:nombres de tabla completo

SELECT x FROM [dbo].Foo vs SELECT x FROM Foo.

Esto se supone que guarda una búsqueda, porque de lo contrario SQL Server buscará una tabla Foo que pertenezca al usuario en el contexto de conexión.

Hoy me dijeron que siempre incluye el nombre de la base de datos mejora el rendimiento de la misma manera, incluso si se está consultando la base de datos que ha seleccionado en la cadena de conexión:

SELECT x FROM MyDatabase.[dbo].Foo 

¿Hay algo de verdad en esto? ¿Tiene esto sentido como un estándar de codificación? ¿Algo de esto (incluso el primer ejemplo) se traduce en beneficios mensurables?

¿Estamos hablando de unos pocos ciclos para buscar un diccionario adicional en el servidor de la base de datos, más SQL inflado y concatenación adicional en el servidor web (u otro cliente)?

+2

Si marca la diferencia, agrega un problema de mantenimiento ya que todas sus consultas tienen el nombre de la base de datos en ellas. Hace que sea muy difícil cambiar el nombre de una base de datos. – adrianbanks

+0

Depende de lo que su mantenimiento. Tener nombres totalmente calificados dentro de mi procedimiento particular garantiza que funcione exactamente de la misma manera, incluso cuando esté conectado a un DB diferente en mi entorno de prueba; en mi caso particular, quiero el entorno de prueba. para producir resultados de "producción" en lo que respecta al proceso almacenado.Tal vez no sea una buena práctica, me doy cuenta, pero nuestro vasto panorama de tiendas de datos no tiene contrapartes totalmente reproducidas en un estado limpio y aislado en algún dominio TEST separado, por lo que muchos de nuestros entornos TEST/DEV son, en el mejor de los casos, una mezcla de datos falsos y de producción. – bkwdesign

Respuesta

11

Una cosa a tener en cuenta es que se trata de una compilación de unión, no una ejecución para una sola. Por lo tanto, si ejecuta la misma consulta 1 millón de veces, solo la primera ejecución 'alcanzará' el tiempo de búsqueda, el resto reutilizará el mismo plan y los planes se vincularán previamente (los nombres ya están resueltos para identificar objetos).

+0

+1 Exactamente: guarda la sobrecarga de compilación – gbn

1

Pruébelo? Recorra un millón de consultas de ambos y vea cuál termina primero.

Supongo que es un montón de literas. Los desarrolladores de MS SQL pasan millones de horas investigando la eficiencia de los algoritmos de búsqueda y los métodos de almacenamiento para ser frustrados por los usuarios que no especifican nombres de tablas totalmente calificados. Cómico.

0

Como dijo Spencer: pruébalo, por supuesto, asegúrate de borrar el caché cada vez, ya que esto interferirá con tus resultados.

http://www.devx.com/tips/Tip/14401

Me gustaría también se sorprenda si se hizo alguna diferencia apprecible.

1

SQL Server no realizará una búsqueda adicional si el esquema predeterminado es el mismo. Debería incluirse si no es así y es una consulta que se usa mucho.

El nombre de la base de datos no beneficiará el rendimiento de la consulta. Creo que esto se puede ver con el Plan de ejecución estimado en Management Studio.

4

En este caso, yo personalmente preferiría la legibilidad sobre el pequeño aumento de rendimiento que esto podría causar, en su caso.

SELECT * FROM Foo 

Parece mucho más fácil para escanear que:

SELECT * FROM MyDatabase.[dbo].Foo 
Cuestiones relacionadas