:
---- 關鍵字: 字段 增加 刪除 日誌 內部 internals
分析一下給表增加欄位時sybase資料庫的內部處理過程。
表原來的結構:
create table t(id int, col1 varchar(30))
向表中插入資料:
測試表t的object_id是:
1> select object_id('t')
2> go
-----------
608002166
利用dbcc log分析資料庫的日誌,可以看出上面的四條insert語句對應了四個單獨的事務。因為sybase中預設是隱式提交的。
四條記錄的頁號和偏移分別是:
row1. pageno=801 offset=32
row2. pageno=801 offset=44
row3. pageno=801 offset=56
row4. pageno=801 offset=68
接著,向表中新增乙個identity欄位。
再利用dbcc log分析日誌,我們可以看出在這四行資料上面發生了延遲更新(op=6,insid在日誌型別中是延遲更新的意思!)。
每行資料的頁號和偏移變成了:
row1. pageno=801 offset=32
row2. pageno=801 offset=49
row3. pageno=801 offset=66
row4. pageno=801 offset=83
比較一下前後的各行的偏移量。我們發現:第一行沒有移動,第二行向下移動了5(49-44)位元組,第三行向下移動了10位元組,第四行向下移動了15位元組(83-68)。也就是說,每行增加了5個位元組的資料。5個位元組是因為:int型別占用4個位元組再加乙個位元組的長度。
關於alter table add語法方面的
在向表新增列時是不能夠新增not null 列的。錯誤如下所示:
1. 只能新增為空的字段。
2. 但是,本文前面的向表新增identity型別的int 非空字段卻可以。alter table t add col2 int identity not null卻可以。
3. 這似乎和sql標準中的不太一致。
4. 分析page:801頁面上的資料。發現最後新增的identity列居然是作為可變長欄位進行儲存的。欄位col即使被定義為非空,但是物理儲存上卻是作為可變長儲存的。因為是varchar型別。
注意:後來我通過試驗發現有一種例外情況。就是新增乙個非空列的時候對這列指定預設值,就可以成功增加這列。
比如:alter table test add colc char(1) default "0" not null
這條語句就能夠成功執行!
刪除表上的字段的時候報錯:
報錯的原因是表t所在的資料庫testdb沒有開啟select into buklcopy選項。
開啟testdb的select into/bulkcopy/pllsort 選項
再次執行刪除列的操作,可以執行成功!
刪除完col2之後,再次分析一下dbcc log的結果。
發現背後進行的操作有三步:
第一:刪除表t在systabstats上的統計資訊並重建;
第二:刪除在系統表sysstatistics,sysobjects,syscolumns,sysindexes,syspartitions上對應記錄的索引然後重建;
第三:更新在系統表sysstatistics,sysobjects,syscolumns,sysindexes,syspartitions上對應記錄的資訊。
刪除表上的列的過程的日誌資訊,如下:
有興趣的可以自己分析一下。
鍊錶節點的增加和刪除
struct listnode 增加節點 第乙個引數是乙個指向指標的指標。當我們往乙個空煉表中插入乙個節點時,新插入的節點 就是鍊錶的頭指標。由於此時會改動頭指標,因此必須把phead引數設為指向指標的指標 void addtotail listnode phead,int value else v...
原生JS給DOM元素增加修改和刪除class
之前一直使用jq,處理頁面結構變化都很方便,不過在某些不實用jq的專案裡,還是必須得知道如何使用原生js去處理頁面中簡單的一些樣式變化。這裡介紹js針對css方面的一些基本操作。hhh change 增加class 方法1 如果你的頁面裡有很多個 temp 類的話 感覺這種不太適合 classarr...
通過JS給HTML元素增加 刪除和獲取屬性內容
1.通過id或者其他元素找到要處理的html物件 舉例通過id var obj document.getelementbyid id 2.操作此物件 新增屬性 obj.setattribute attr name attr value 獲取屬性值 obj.getattribute attr name...