Domanda

Se creo una vista indicizzata (in SQL Server 2008), questo significa che copiare tutti i dati necessari dalle tabelle di origine in una nuova tabella separata? O sono solo alcune piccole puntatori / indici salvati, per rappresentare questa visione?

È stato utile?

Soluzione

Sì, i dati vengono copiati e conservati separatamente, quindi se si modifica la tabella sottostante, la vostra vista indicizzata si aggiornerà automaticamente. Questo cause un sacco di blocco contesa . Anche la vista indicizzata può crescere più grandi delle tabelle sottostanti e diventare controproducente.

Altri suggerimenti

Sì, i dati vengono copiati. Altre piattaforme di database come Oracle si riferiscono a questo come un vista materializzata perché i dati saranno Materialise in una forma fisica.

Quando un indice cluster univoco viene creato in una vista, il set di risultati è memorizzato nel database come una tabella con un indice cluster viene memorizzato.

Come vengono apportate modifiche ai dati nelle tabelle base, le modifiche di dati si riflettono nei dati memorizzati nella vista indicizzata

~ da MSDN

È possibile utilizzare il comando (non documentato ma ampiamente utilizzato) DBCC PAGE per vedere esattamente ciò che è memorizzato. Di seguito vi creare una vista indicizzata e stampare il contenuto della prima pagina di dati.

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top