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?

¿Fue útil?

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top