Vistas indexadas y combinaciones izquierdas de una vez por todas
Estoy usando MSSQL Server 2008 R2 y estoy tratando de optimizar mis Vistas cuando me topé con Vistas Indizadas. Desafortunadamente, la mayoría de mis vistas usan una combinación externa izquierda que no es compatible con las vistas indizadas. Después de un montón de investigación, me quedo confundido la mejor manera de hacer esto. A mi modo de ver, tengo las siguientes opciones:
1) Convierta las combinaciones a la izquierda en combinaciones internas usando el truco para simular una combinación a la izquierda con "OR (IsNull (a) AND IsNull (b))"
Encontré esta solución en un par de lugares, pero se mencionó una pérdida de rendimiento.
2) Convierta las combinaciones a la izquierda en combinaciones internas y reemplace los valores nulos de la columna que acepta valores nulos con guías vacías (00000000-0000-0000-0000-000000000000) y agregue una sola fila en la tabla derecha con una guía correspondiente.
Este parece ser el rendimiento más obvio, pero parece una pérdida de espacio para cada fila que de lo contrario sería NULL.
3) Rompe mi vista en dos vistas. La primera vista es la mayoría de mi lógica que es indexable. Y la segunda vista deriva de la primera vista y agrega las combinaciones a la izquierda.
La idea aquí es que podría haber una ganancia de rendimiento a través de la vista base que se está indexando. Y que incluso consultar la vista derivada obtendría al menos parte del beneficio de rendimiento.
4) No indexar mis puntos de vista
¿Dejar la vista de la forma en que es más eficaz que cualquiera de las opciones anteriores?
5) La idea que no se me ocurrió.
Escribí mi escenario básico de la siguiente manera:
<code> CREATE TABLE [dbo].[tbl_Thumbnails]( [ThumbnailId] [uniqueidentifier] NOT NULL, [Data] [image] NULL, [Width] [smallint] NOT NULL, [Height] [smallint] NOT NULL CONSTRAINT [PK_tbl_Thumbnails] PRIMARY KEY CLUSTERED ( [ThumbnailId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO CREATE TABLE [dbo].[tbl_Tags]( [TagId] [uniqueidentifier] NOT NULL, [ThumbnailId] [uniqueidentifier] NULL CONSTRAINT [PK_tbl_Tags] PRIMARY KEY CLUSTERED ( [TagId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO CREATE VIEW [dbo].[v_Tags] WITH SCHEMABINDING AS SELECT dbo.tbl_Tags.TagId, dbo.tbl_Tags.ThumbnailId FROM dbo.tbl_Tags LEFT OUTER JOIN dbo.tbl_Thumbnails ON dbo.tbl_Tags.ThumbnailId = dbo.tbl_Thumbnails.ThumbnailId GO INSERT INTO tbl_Tags VALUES ('16b23bb8-bf17-4784-b80a-220da1163584', NULL) INSERT INTO tbl_Tags VALUES ('e8b50f03-65a9-4d1e-b3b4-268f01645c4e', 'a45e357b-ca9c-449a-aa27-834614eb3f6e') INSERT INTO tbl_Thumbnails VALUES ('a45e357b-ca9c-449a-aa27-834614eb3f6e', NULL, 150, 150) </code>
Ahora, al hacer la siguiente consulta se obtiene "No se puede crear el índice en la vista" Test.dbo.v_Tags "porque usa una combinación IZQUIERDA, DERECHA o COMPLETA, y no se permiten combinaciones EXTERNAS en las vistas indexadas. Considere la posibilidad de usar una combinación INTERNA. ":
<code>CREATE UNIQUE CLUSTERED INDEX [TagId] ON [dbo].[v_Tags] ( [TagId] ASC ) GO </code>
Este es el comportamiento esperado, pero ¿qué curso de acción recomendaría para obtener el mejor rendimiento de mi escenario? El punto de partida aquí es el mejor rendimiento.