代码之家  ›  专栏  ›  技术社区  ›  Pure.Krome

在SQLServer2008中为视图编制索引是否实际复制了原始数据?

  •  4
  • Pure.Krome  · 技术社区  · 14 年前

    4 回复  |  直到 14 年前
        1
  •  3
  •   A-K    14 年前

    是的,数据是单独复制和存储的,因此如果修改基础表,索引视图将自动更新。 This causes a lot of lock contention . 此外,索引视图可能会比基础表更大,从而产生反作用。

        2
  •  3
  •   Joe Stefanelli    14 年前

    Materialized View 因为数据会 materialize 变成一种物质形态。

        3
  •  2
  •   Anil Soman    14 年前

    在视图上创建唯一聚集索引时,结果集存储在数据库中,就像存储具有聚集索引的表一样。

    当对基表中的数据进行修改时,数据修改会反映在索引视图中存储的数据中

    ~来自msdn

        4
  •  1
  •   Martin Smith    14 年前

    您可以使用(未记录但广泛使用) 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)
    
    推荐文章