2011-05-06 21 views
13

¿Existe una mejor práctica general sobre si se deben usar vistas anidadas o no? ¿Hay un golpe de rendimiento al usar vistas anidadas? ¿Existe una mejor práctica que diga que realmente no hay un golpe de rendimiento hasta que tienes 4 o más capas de profundidad?Vistas de anidamiento del servidor cuadrado 2008

La razón por la que estoy preguntando esto es porque estoy teniendo problemas para usarlas o no. No es inusual obtener una solicitud de informe de la cual la única forma en que puedo acceder a esa información es unir 20 o más tablas. Los campos no se devuelven de todas las tablas, pero son necesarios para seleccionar los datos correctos. En este caso, me gusta anidar las vistas y reutilizar las vistas de nivel inferior para otros informes, porque si se necesita un cambio en la lógica, solo actualizo una vista y todos los informes se actualizan. Muchas de las tablas con las que trabajo contienen millones y millones de registros.

Sin embargo, quizás esta no sea una buena práctica. ¿Te importa compartir tus pensamientos sobre esto?

+2

¿Las vistas hacen agregaciones? ¿Estás uniéndote a la misma tabla base? Mire el plan de ejecución y vea si está obteniendo planes subóptimos. –

+0

¿Podría proporcionar un ejemplo de una "vista anidada"? Solo estoy familiarizado con la terminología como: vista en línea (tabla derivada de AKA), vistas no materializadas y materializadas (vistas indexadas de AKA en SQL Server). –

+1

@OMG - Lo interpreto en el sentido de Vistas que hacen referencia a otras Vistas que hacen referencia a otras Vistas ... –

Respuesta

11

Yo evitaría esto a toda costa. Primero, una vez que anida las vistas, no pueden ser indexadas. Luego, dado que tienen que materializar completamente las vistas subyacentes para llegar a la siguiente capa. De modo que podría materializar varios millones de registros para obtener un resultado final de 5 registros. Casi perdimos un cliente multimillonario porque el rendimiento fue tan abismal cuando nuestros desarrolladores lo hicieron en una base de datos (no en una base de datos que tuve en cuenta).

Finalmente, he encontrado que este tipo de capas son mucho, mucho más difíciles de mantener cuando necesita hacer un cambio. No es divertido rastrear a través de 12 capas de vistas para encontrar la que necesita corregir. También encontramos un problema porque a los desarrolladores les resultaba más fácil simplemente agregar otra capa que corregir las capas subyacentes y luego intentaban acceder a demasiadas tablas en una consulta y demasiadas de esas tablas eran la misma tabla de registro multimillonaria a la que se accedía 7 u 8 veces en diferentes capas de las vistas.

No hay ninguna circunstancia en la que permitiría más de una capa en una vista en una base de datos que administro y me enojaría si lo hiciera.

+2

+1 SQL es una circunstancia en la que se repite para evitar la anidación de vistas. – Matthew

+6

El optimizador puede hacer uso de índices en vistas anidadas a menos que la lógica de vista sea complicada y oscurezca el índice. Las vistas indizadas presentan un conjunto diferente de problemas, pero para vistas ordinarias que realizan uniones simples, anidar NO impide que el optimizador use un índice. –

+0

Quiero decir que no puede crear índices en las vistas, no es que no puedan usar índices subyacentes. Sin embargo, puede llegar muy rápidamente al punto donde el optimizador no puede entender cómo manejar esto eficientemente. No solo se convierten rápidamente en un desastre inmanejable. Es un antipatrón SQL que debe evitarse si es posible y casi siempre es posible. – HLGEM

4

Otras opciones a considerar: Vistas indexadas - Puede ser peligroso si no se usa correctamente, pero las ganancias de rendimiento pueden ser sorprendentes.

Analytics - tales como conjuntos de agrupación

procedimientos & tablas temporales - Obtener los datos que necesita a través de procedimiento de escribirlo a tablas temporales selección de las tablas temporales.

En general, no me gusta el golpe de rendimiento de la vista en la vista o las vistas anidadas.

Generalmente puede generar una vista usando las uniones correctas entre las tablas que contienen toda la información después y filtra los datos usando los criterios.

+0

Pregunta acerca de las vistas indizadas. ¿Debe especificarse explícitamente la vista o el optimizador elegirá una vista indizada incluso si va a algunas tablas base, pero en la ruta de ejecución determina que la vista es mejor? – user742085

+1

Encontré esta respuesta. No es necesario hacer referencia directamente a la vista en la consulta para que el optimizador la use en el plan de ejecución de la consulta. – user742085

+0

@user - Depende de la versión. Esto solo ocurre en la edición Enterprise y Developer; de lo contrario, debe hacer referencia explícita a la vista y usar la sugerencia 'noexpand'. –