No indexar una vista en SQL Server 2008 en realidad duplicar los datos originales?
-
01-10-2019 - |
Pregunta
Si creo una vista indizada (en SQL Server 2008), ¿significa que copiar todos requieren los datos de las tablas de origen en una nueva tabla por separado? O se guardan sólo algunos indicadores minúsculos / índices, para representar este punto de vista?
Solución
Sí, los datos se copian y se almacena por separado, por lo que si se modifica la tabla subyacente, su vista indizada se actualizará automáticamente. Este causas una gran cantidad de contención de bloqueo . También la vista indizada puede crecer más que las tablas subyacentes y llegar a ser contraproducente.
Otros consejos
Sí, se copian los datos. Otras plataformas de bases de datos como Oracle se refieren a esto como una vista materializada debido a que los datos serán Materialise en una forma física.
Cuando se crea un índice agrupado único en una vista, el conjunto de resultados se almacena en la base de datos como una tabla con un índice agrupado se almacena.
A medida que se introducen modificaciones en los datos de las tablas de base, las modificaciones de datos se reflejan en los datos almacenados en la vista indizada
~ de MSDN
Puede utilizar el comando DBCC PAGE
(indocumentado, pero ampliamente utilizado) para ver exactamente lo que está almacenado. Lo siguiente creará una vista indizada e imprimir el contenido de la primera página de datos.
SET NOCOUNT ON
IF OBJECT_ID('tempdb..#dbcc_ind') IS NOT NULL
TRUNCATE TABLE #dbcc_ind
ELSE
CREATE TABLE #dbcc_ind
(PageFID TINYINT,
PagePID INT,
IAMFID TINYINT,
IAMPID INT,
ObjectID INT,
IndexID TINYINT,
PartitionNumber TINYINT,
PartitionID BIGINT,
iam_chain_type VARCHAR(30),
PageType TINYINT,
IndexLevel TINYINT,
NextPageFID TINYINT,
NextPagePID INT,
PrevPageFID TINYINT,
PrevPagePID INT,
PRIMARY KEY (PageFID, PagePID));
IF OBJECT_ID('dbo.vtest') IS NULL
CREATE TABLE dbo.vtest (
i INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
c1 CHAR(500) NOT NULL DEFAULT REPLICATE('x',500),
c2 CHAR(500) NOT NULL DEFAULT REPLICATE('y',500)
)
GO
INSERT INTO dbo.vtest DEFAULT VALUES
GO 10
IF OBJECT_ID('dbo.ixViewTest') IS NULL
BEGIN
EXEC('CREATE VIEW dbo.ixViewTest
WITH SCHEMABINDING
AS
SELECT i,c1,c2
FROM dbo.vtest;')
EXEC('CREATE UNIQUE CLUSTERED INDEX [cix] ON [dbo].[ixViewTest] ([i] ASC)')
END
GO
DECLARE @command VARCHAR(1000)
SET @command = 'DBCC IND(' + QUOTENAME(DB_NAME()) + ', ixViewTest,1) WITH NO_INFOMSGS;'
INSERT INTO #dbcc_ind
EXEC ( @command );
SELECT @command= 'DBCC PAGE (' + QUOTENAME(DB_NAME()) + ',' + CAST(PageFID AS VARCHAR(5)) + ',' + CAST(PagePID AS VARCHAR(10)) + ',1) ;'
FROM #dbcc_ind
WHERE PageType=1
AND PrevPagePID=0
DBCC TRACEON(3604)
EXEC ( @command )
DBCC TRACEOFF(3604)