¿Cómo afecta el uso de esquemas separados al rendimiento de SQL Server 2008?

11

Quiero usar esquemas separados para objetos con diferentes propósitos en nuestra base de datos SQL Server 2008. En este momento, usamos una convención de nomenclatura bastante entumecedora para indicar el propósito de una tabla o procedimiento almacenado, y los prefijos significan que tenemos que escanear cinco o seis caracteres x incluso antes de que veamos el comienzo del nombre único. Me gustaría usar esquemas separados para tablas que solo se usan para controlar la interfaz de usuario (menús, roles por persona, etc.) y para aquellas que son tablas de dimensiones frente a tablas de hechos, etc.

Mi pregunta es, ¿habrá impactos en el rendimiento del uso de múltiples esquemas (¿esquemas?) Se opuso al viejo y buen dbo para todo?


fuente

Respuestas:

4

Puede haber un impacto en el rendimiento del optimizador de consultas, aunque sea pequeño, dependiendo de su estilo de codificación. Si hace referencia a una tabla sin un esquema, el optimizador debe intentar identificar la tabla primero verificando las tablas dentro del esquema predeterminado de los usuarios (si hay una), luego usando dbo. Y luego todo lo demás. Si hace referencia explícita a las tablas como schema.table, lo que probablemente sea una buena práctica de todos modos, incluso se evitará esta sobrecarga menor.


fuente
1

No hay diferencia en el rendimiento. Sin embargo, está utilizando esquemas en este momento (incluso si no lo sabe).

El uso de referencias a objetos de esquema, como tablas, procedimientos almacenados, UDF, etc., que son no calificado por el esquema no tener un impacto en el rendimiento. Las referencias siempre deben calificarse por esquema. Tales referencias no calificadas deben resolverse, y eso sucede así:

  • Primero, busque un objeto con el mismo nombre y escriba bajo el esquema predeterminado del usuario bajo cuyas credenciales se estableció la sesión (por ejemplo jsmith). Si se encuentra, se utiliza esa instancia.
  • De lo contrario, busque un objeto con el mismo nombre y escriba debajo del esquema dbo.

Esto tiene varios efectos:

  • La mayoría de las veces, se requieren dos búsquedas para resolver la referencia en lugar de la búsqueda única requerida si la referencia está calificada por el esquema.
  • El plan de ejecución obtenido cuando la consulta / procedimiento almacenado / función definida por el usuario está vinculada no se puede almacenar en caché y reutilizar.

El efecto final que solo encontrará, dolorosamente, cuando algo se rompe es que diferentes usuarios pueden obtener diferentes resultados de una consulta determinada o procedimiento almacenado. Algo así select * from foo join barpuede funcionar bien para mí como propietario de db; puede estar roto para el usuario jsmithque, inadvertidamente o no, creó una tabla nombrada foobajo su propio esquema ( jsmith.foo) en la misma base de datos.

Por esta razón, también, createy las dropdeclaraciones deben calificar esquemáticamente el nombre del objeto que se está creando o descartando.


fuente