今晚在網上又看了一下書簽查找 使用非聚集索引使用的是書簽查找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上
這句話更加論證了我的觀點:
聚集索引:把書里面的內容放到書簽里面,指定了聚集索引表列的所有內容(整行記錄)先放到書簽里面
非聚集索引:書里面的內容不放到書簽里面,只放指針
因為書中的例子用一個聚集索引表跟一個非聚集索引表做插入操作,比較了非聚集索引跟非聚集索引做插入操作要申請的鎖
有興趣的朋友可以看一下這本書!!
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com