sql - sobre - Vistas indexadas y combinaciones izquierdas de una vez por todas
vista indexada sql server (1)
¿Por qué estás indexando tus puntos de vista? Mencionó "pérdida de espacio" en su solución 2, pero ¿sabía que cuando indexa su vista, la mantiene en la base de datos?
En otras palabras, hace una copia de los datos que la vista devolvería en la base de datos y cada vez que los datos se actualizan en las tablas de origen, algún mecanismo interno de SQL Server tiene que actualizarlo en esta nueva estructura de datos creada porque ahora el servidor SQL Lee de la vista, ya no de las tablas.
Si usa Profiler + DTA o incluso DMVS , puede crear los índices correctos que se crearán en sus tablas de los que cualquier vista se beneficiaría
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 utilizan 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 izquierdas en combinaciones internas utilizando el truco para simular una combinación 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 nulos de la columna anulable con guids vacíos (00000000-0000-0000-0000-000000000000) y agregue una sola fila en la tabla derecha con un guid correspondiente.
Este parece ser el rendimiento más obvio, pero parece un desperdicio de espacio para cada fila que de lo contrario sería NULL.
3) Divide 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:
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)
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 EXTRA en las vistas indizadas. En su lugar, considere la opción de una combinación INTERNA. ":
CREATE UNIQUE CLUSTERED INDEX [TagId] ON [dbo].[v_Tags]
(
[TagId] ASC
)
GO
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.