设为首页 加入收藏

TOP

索引修改内幕(三)
2015-11-21 01:40:20 来源: 作者: 【 】 浏览:1
Tags:索引 修改 内幕
低,如Identity)。聚集索引表中,就算表的物理位置发生改变,也不会导致索引键改变,所心非聚集索引也不会被修改。
?
堆表中,行定位器是行的物理地址。行移动不会导致非聚集索引修改,因为它在行的原地址放置一个转发指针指向新地址,非聚集索引仍然引用原来的行地址,通过转发指针做重定向而已。但是堆表物理位置改变,会导致所有非聚集索引被修改。
?
原地更新
?
原地更新行是SQL Server的更新规则。每一个原地更新操作都会在向事务日志写入一行,除非表上有更新触发器或者被标记为复制时。
?
如果原地更新需要修改索引键,则每个操作会向事务日志先写入一条DELETE记录,然后再写入一样INSERT记录。
?
原地更新的场景:
?
更新堆,被更新的页有足够的空间存放更新后的行。
?
更新聚集索引表,且聚集索引列没有被更新。
?
更新聚集索引表的聚集索引列,但是更新后的行不会发生移动。
?
非原地更新
?
非原地更新发生在更新聚集索引的索引键时。更新会变成先删除再插入两个操作。更新索引键也有可能是混合更新,即有些行是原地更新,其它行是非原地更新。更新聚集索引键时,SQL Server会生成一个包含删除和插入操作涉及到的所有行的列表。这个列表较小就存在内存,较大就存在tempdb。然后根据键值和操作符(删除或者插入)对列表排序。接下来分种情况:
?
如果索引键值非唯一,则先删除再插入。
?
如果索引键值唯一,则会将删除和插入这两个操作合并成一个更新操作。这样更高效。
?
表级修改vs.索引级修改
?
在多索引的表上修改多行数据时,SQL Server提供两种索引维护策略:表级修改和索引级修改。表级修改也叫做"一次一行"(row-at-a-time),索引级修改也叫做”一次一索引“(index-at-a-time)。
?
在表级修改中,每一行数据被修改时,所有的索引都需要被维护一次。如果更新流是无序的,则SQL Server每更新一行就需要访问一次索引,这样就增加很多的随机访问。如果更新流是有序的,因为只能按一种条件排序,所以最多有一个索引不需要随机访问。
?
在索引级修改中,SQL Server将所有将要被修改的行汇总起来,并针对索引进行排序(有几个索引,就会有几次排序)。然后将所有的修改汇总再应用到每个索引上。可以看出,这个过程中每个索引页最多被访问一次。
?
修改大表和索引上中的很少部分数据,SQL Server一般采用表级修改。如果修改的量非常大,则一般会选择索引级修改。通过执行计划可以看出采用的哪种修改方式:每个受影响的索引前都有一个UPDATE操作符,则是索引级。如果只有UPDATE操作符,则是表级。
首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇通过亚马逊电影评论的数据包抓取.. 下一篇SQL 中GO的作用

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: