Question

Si je crée un Indexed View (dans Sql Server 2008), ce que cela signifie que je copie toutes les données nécessaires à partir des tables source dans une nouvelle table séparée? Ou ne sont que quelques petits pointeurs / index enregistrés, pour représenter ce point de vue?

Était-ce utile?

La solution

Oui, les données sont copiées et stockées séparément, donc si vous modifiez la table sous-jacente, votre vue indexée mettra à jour automatiquement. Cela provoque beaucoup de contention de verrouillage . En outre la vue indexée peut croître plus que les tables sous-jacentes et de devenir contre-productif.

Autres conseils

Oui, les données sont copiées. plates-formes d'autres bases de données telles que Oracle appellent cela un vue matérialisée car les données Materialise en une forme physique.

Quand un index cluster unique est créé sur une vue, le jeu de résultats est stocké dans la base de données comme une table avec un index ordonné en clusters est stocké.

Comme des modifications sont apportées aux données dans les tables de base, les modifications de données sont reflétées dans les données stockées dans la vue indexée

~ de msdn

Vous pouvez utiliser la commande DBCC PAGE (sans papier, mais largement utilisé) pour voir exactement ce qui est stocké. Ce qui suit va créer une vue indexée et imprimer le contenu de la première page de données.

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top