Действительно ли индексирование представления в Sql Server 2008 дублирует исходные данные?

Если я создаю индексированное представление (в Sql Server 2008), значит ли это, что я копирую все необходимые данные из исходных таблиц в отдельную новую таблицу? Или сохраняются только некоторые крошечные указатели/индексы для представления этого представления?


person Pure.Krome    schedule 07.09.2010    source источник


Ответы (4)


Да, данные копируются и хранятся отдельно, поэтому, если вы измените базовую таблицу, ваше индексированное представление будет обновляться автоматически. Это вызывает много споров о блокировках. Кроме того, индексированное представление может стать больше, чем базовые таблицы, и стать непродуктивным.

person A-K    schedule 07.09.2010

Да, данные копируются. Другие платформы баз данных, такие как Oracle, называют это материализованным представлением, поскольку данные будут материализоваться в физическую форму.

person Joe Stefanelli    schedule 07.09.2010

Когда для представления создается уникальный кластеризованный индекс, результирующий набор сохраняется в базе данных точно так же, как хранится таблица с кластеризованным индексом.

По мере внесения изменений в данные в базовых таблицах изменения данных отражаются в данных, хранящихся в индексированном представлении.

~ из MSDN

person Anil Soman    schedule 07.09.2010
comment
Так что ответ... 'Да - данные дублируются'... ?? - person Pure.Krome; 07.09.2010

Вы можете использовать (недокументированную, но широко используемую) команду DBCC PAGE, чтобы увидеть, что именно хранится. Далее будет создано индексированное представление и напечатано содержимое первой страницы данных.

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)
person Martin Smith    schedule 07.09.2010