(Sql Server 2008 で) インデックス付きビューを作成すると、必要なすべてのデータをソース テーブルから別の新しいテーブルにコピーすることになりますか? または、このビューを表すために、いくつかの小さなポインター/インデックスのみが保存されますか?
4 に答える
3
はい、データがコピーされます。Oracle などの他のデータベース プラットフォームでは、データが物理的な形式に具体化されるため、これをマテリアライズド ビューと呼びます。
于 2010-09-07T14:53:03.230 に答える
3
はい、データはコピーされて個別に保存されるため、基になるテーブルを変更すると、インデックス付きビューが自動的に更新されます。 これにより、多くのロック競合が発生します。また、インデックス付きビューが基になるテーブルよりも大きくなり、逆効果になる可能性があります。
于 2010-09-07T14:59:34.480 に答える
2
ビューに一意のクラスター化インデックスが作成されると、クラスター化インデックスを持つテーブルが格納されるのと同様に、結果セットがデータベースに格納されます。
ベース テーブルのデータに変更が加えられると、データの変更はインデックス付きビューに格納されたデータに反映されます。
~ msdn から
于 2010-09-07T05:18:54.670 に答える
1
(文書化されていないが広く使用されている)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)
于 2010-09-07T16:03:45.633 に答える