#sql-server #sql-server-2008 #indexed-view #indexed-views
#sql-server #sql-server-2008 #indexed-view #indexed-views
Вопрос:
Если я создаю индексированное представление (в Sql Server 2008), означает ли это, что я копирую все необходимые данные из исходных таблиц в отдельную новую таблицу? Или сохраняются только некоторые крошечные указатели / индексы для представления этого представления?
Ответ №1:
Да, данные копируются и хранятся отдельно, поэтому, если вы измените базовую таблицу, ваше индексированное представление обновится автоматически. Это вызывает много споров о блокировках. Кроме того, индексированное представление может вырасти больше, чем базовые таблицы, и стать контрпродуктивным.
Ответ №2:
Да, данные скопированы. Другие платформы баз данных, такие как Oracle, называют это материализованным представлением, поскольку данные материализуются в физическую форму.
Ответ №3:
Когда в представлении создается уникальный кластеризованный индекс, результирующий набор сохраняется в базе данных точно так же, как хранится таблица с кластеризованным индексом.
По мере внесения изменений в данные в базовых таблицах изменения данных отражаются в данных, хранящихся в индексированном представлении
~ из msdn
Комментарии:
1. Итак, ответ таков … ‘Да — данные дублируются’ … ??
Ответ №4:
Вы можете использовать (недокументированную, но широко используемую) 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)