Frage

Wenn ich erstelle eine indizierte Sicht (in SQL Server 2008), bedeutet die i kopieren Sie alle Daten aus den Quellentabellen in eine separate neue Tabelle erforderlich? Oder nur einige winzige Zeiger / Indizes gespeichert, diese Ansicht zu vertreten?

War es hilfreich?

Lösung

Ja, werden die Daten kopiert und separat gespeichert werden, so dass, wenn Sie die zugrunde liegende Tabelle ändern, wird Ihre indizierte Sicht automatisch aktualisiert. Dies verursacht viele Sperrenkonflikte . Auch die indizierte Sicht wachsen kann größer sein als die zugrunde liegenden Tabellen und wird kontraproduktiv.

Andere Tipps

Ja, werden die Daten kopiert. Andere Datenbankplattformen wie Oracle bezeichnen dies als materialisierte Ansicht weil die Daten materialisieren in eine physische Form.

Wenn ein eindeutiger gruppierten Index für eine Sicht erstellt wird, wird die Ergebnismenge in der Datenbank wie eine Tabelle gespeichert mit einem gruppierten Index gespeichert ist.

Als Modifikationen an den Daten, die in den Basistabellen vorgenommen werden, werden die Datenänderungen die sich in den in der indizierten Sicht gespeicherten Daten

~ von Msdn

Sie können den (ohne Papiere, aber weit verbreitet) DBCC PAGE Befehl genau sehen, was gespeichert wird. Im Folgenden wird eine indizierte Sicht erstellen und die Inhalte der ersten Datenseite drucken.

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top