sybase中給表增加和刪除欄位時內部處理過程分析

2021-06-16 04:20:46 字數 2240 閱讀 5088

:

---- 關鍵字: 字段 增加 刪除 日誌 內部 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...