我們都知道,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
新聞熱點
疑難解答