我们都知道,Sql Server在一个数据量巨大的表中添加一个非空栏位是比较费心的,缺乏经验的DBA或是开发人员甚至可能鲁莽地直接添加导致阻塞相应业务,甚至可能因为资源欠缺造成实例的全局问题.当然这都是Sql 2008R2及以前版本的情况.在SQL2012中采用了新的实现方式.这里我将对比相应的实现方式给大家做个介绍.并简单说明Sql Server早期版本添加非空列的方法.
添加非空栏位的实现方式
早期版本(Sql Server2008R2及以前)添加非空栏位(要求有默认值)是对表中的所有数据行依次修改调整
我们通过一个简单的实例来看下
Sql 2008R2 SP2 Code
Create database tadnullgouse tadnullgocreate table t2(id int not null identity (1,1),dystr varchar(20),fixstr char(30));goset nocount on declare @batchSize intset @batchSize=1000declare @i intset @i=0while(@i<20000)begin if (@i%@batchSize=0) begin if (@@TRANCOUNT>0)COMMIT TRAN BEGIN TRAN end insert into t2(dystr,fixstr)values('aaa'+str(RAND()*100000000),'bbb'+str(RAND()*100000000)) set @i=@i+1end if (@@TRANCOUNT>0)COMMIT TRANdbcc ind(tadnull,t2,1) -----find a datapage pageid 21 dbcc traceon(3604) dbcc page('tadnull',1,21,3)-----view the datapage 21
通过DBCC PAGE我们打印其中的一个数据页进行分析.
可以看到图1-1当前数据页的最后修改的日志记录为m_lsn = (28:69:279)
数据页中第一行数据(slot 0)页偏移量0x60,行长度为58
新闻热点
疑难解答