今晚在網上又看了一下書籤尋找
使用非叢集索引使用的是書籤尋找bookmark lookup
叢集索引不使用書籤尋找
我的理解:
叢集索引:把書裡面的內容放到書籤裡面,指定了叢集索引表列的所有內容(整行記錄)先放到書籤裡面
查詢:當查詢的時候根據書籤目錄,直接尋找書籤,因為內容直接存放在書籤裡面,所以查詢速度很快
修改資料:但是如果要修改資料,那麼,資料庫先找到書籤,然後修改書籤裡面的內容,再根據書籤裡的內容找到書本的內容,然後修改書本裡的內容(即要修改兩次)
因為書本裡的內容也存放在書籤裡面
非叢集索引:書裡面的內容不放到書籤裡面,只放指標
查詢:資料庫先找到書籤,再根據書籤裡的內容找到書本裡的內容,所以比叢集索引慢,但是因為跟叢集索引一樣加了書籤,所以比沒有加索引的表查詢快
修改資料:資料庫先找到書籤,再根據書籤裡的內容找到書本的內容,然後修改書本裡的內容,因為書籤裡不存放書本裡的內容,所以修改速度比叢集索引快
發現叢集索引還有一個好處:就是比起非叢集索引,阻塞幾率比非叢集索引少
比如:我有兩張表:EmployeeA表和EmployeeB表 ,兩張表都有兩列是EmployeeID 和Name。
EmployeeA表建立叢集索引在EmployeeID 上 ,EmployeeB表建立非叢集索引在EmployeeID上!!!!!!!!!!!!!!!!!
假如兩張表都有3條記錄,資料都是一樣的
EmployeeID Name
1 小明
2 小方
3 小青
現在當我在一個新會話裡(會話一)update EmployeeB表
begin tran
update EmployeeB表 set Name='小華' where EmployeeID=2
這個sql不提交
然後在另一個會話裡(會話二)select EmployeeB表裡的內容
begin tran
select * from EmployeeB表 where EmployeeID=3
這時候查詢EmployeeB表的那個會話二就會被阻塞,因為他要等會話一提交事務才能繼續,因為會話一在EmployeeID=2的那條記錄上
加上了 “獨佔鎖定”,所以會話二不能繼續往下尋找。只要會話一提交事務,會話二就能尋找EmployeeID=3的那條記錄並顯示出來
而叢集索引就不會有這個問題,為什麽呢?
之前講過:
叢集索引:把書裡面的內容放到書籤裡面,指定了叢集索引表列的所有內容(整行記錄)先放到書籤裡面
非叢集索引:書裡面的內容不放到書籤裡面,只放指標
如果是叢集索引的話,要尋找EmployeeID=3的那條記錄的內容,只是要從書籤裡把內容讀取出來就可以了,不用到資料頁裡去讀資料
因為update語句需要到資料頁裡去讀資料,所以大家互相不影響,但是,非叢集索引需要到書本裡(資料頁)裡去讀取內容(資料)
所以大家就會互相阻塞了,因為會話一鎖定了EmployeeID=2那條記錄,如果不提交的話,會話二無辦法讀取內容並顯示出來
以上是個人的通俗理解,如有錯誤,希望大家指正o(∩_∩)o
準備訓教了,明天上班o(∩_∩)o
後記,今天在看了Microsoft SQLSERVER企業級平台管理實踐中的 P294 頁,這頁裡面講述了一個insert動作要申請的鎖
重點是最後一個句話:唯一不同的是heap結構上還得申請一個RID鎖。因為真正的資料不是放在索引上,而是放在heap上
這句話更加論證了我的觀點:
叢集索引:把書裡面的內容放到書籤裡面,指定了叢集索引表列的所有內容(整行記錄)先放到書籤裡面
非叢集索引:書裡面的內容不放到書籤裡面,只放指標
因為書中的例子用一個叢集索引表跟一個非叢集索引表做插入操作,比較了非叢集索引跟非叢集索引做插入操作要申請的鎖
有興趣的朋友可以看一下這本書!!