更新计划

    当优化insert,update和delete 这些数据修改的语句时,优化器必须要处理几个特殊的问题。下面我将面熟SQL server 在处理这些语句的时候所采用的方法。

    IUD(insert,update,delete) 计划包括两个阶段。第一阶段读取数据,它通过生成用于描述更改的数据流(data stream) 来确定哪些行被insert/update/delete。对于insert ,数据流包含列值,对于delete,它包含表健(table keys),对于update ,它既包括表健也包括被修改的列的值。第二阶段把数据流中的更改应用到表,此外,它通过执行约束验证并采取必要措施以保证数据完整性,它维护非聚集索引和索引视图,如果存在触发器则引发触发器。update 和delete查询计划通常还包含两个对目标表的引用:第一个引用用于标志受影响行,第二个引用执行更改。insert计划只包含一个对目标表的引用,除非这个目标表也参与生成要插入的行.

  在一些简单的情况下,SQL server 把IUD 计划的读写阶段合并在iqi。例如,把值直接插入表(被成为标量插入),或者更新/删除由目标表主键标志的行。

  如果SQL server 需要执行约束验证,则查询计划的第二阶段会自动包含assert运算符,SQL server 通过在受影响行和列上计算一个他那个长成本较低的标量表达式为insert and update 来验证check约束。对包含(foreign key constraint) 的表执行insert 和update 会强制验证外键约束,而且对包含被引用健的表执行update and update会强制验证外键页数,而且对把汗被引用健的表执行update and delete 也会强制验证外键约束。为验证约束,即使不是IUD 操作目标的相关表也被扫描,因此,这些操作也会涉及到数据访问,声明主键将自动地在健列上创建唯一索引,但外键不会这样。对被引用健执行update and delete 必须为每个被更行或删除的主键值访问外键表,如果它是一个级联应用完整性约束来传播更改,否则将验证被一处的健是否存在。因此,要对健值执行update 或对主表执行delete,你应该确保外键上攒在索引。

  在处理Insert and delete 语句时候,除了在聚集索引或堆上执行IUD操作,还会维护所有非聚集索引,update 查询还维护包含被修改列的索引。因为非聚集索引包含聚集索引健和分区健(partitioning key) 以允许高校地访问数据行,所以更新那些参与聚集索引引健或分区键的列的成本很高,因为它要求维护所有索引,更细分区键还会导致行在分区之间移动,因此,如果可能的话,你应该选择不计划更行的列作为聚集健或者分区键

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值