为基表添加索引视图后,在INSERT新的数据时,索引视图是如何添加数据的?是通过扫描基表来更新视图?还是根据视图定义直接计算后加入索引视图?下面是分析案例。
现有基表news,数据行5280,数据页240 。在未创建索引视图的情况与添加数据:
INSERT news (title,ShortTitle,NewsMemo,NewsTypeId,IsDelete,IsVerify,IsUserPost) VALUES('hello test title','hello ShortTitle','hello memo', 35, 0, 1, 0)结果是“逻辑读取 2 次”,执行计划如图:
![a a](https://images.cnblogs.com/cnblogs_com/ideas/201102/201102281143498096.jpg)
下面为基表添加索引视图:
CREATE VIEW v_test_news WITH SCHEMABINDING AS SELECT NewsTypeId,COUNT_BIG(*) as NewsCount FROM dbo.news GROUP BY NewsTypeId; GO CREATE UNIQUE clustered INDEX idx_v_main ON v_test_news(NewsTypeId); GO然后再向基表添加数据,结果是:
/*表 'v_test_news'。扫描计数 0,逻辑读取 6 次,
表 'Worktable'。扫描计数 2,逻辑读取 7 次,
表 'news'。扫描计数 0,逻辑读取 2 次,*/
结论:首先通过IO的次数来看,在添加索引视图后再向基表添加数据时,并没有去扫描基表(因为基表有240页,如果扫描基表至少要240次IO)。其次从执行计划来看,添加索引视图后,明显多了一个分支,这个分支就是根据视图定义来生成数据,然后物理存储。