SQLSERVER書籤查詢的通俗理解

2021-09-08 09:08:19 字數 2073 閱讀 5342

今晚在網上又看了一下書籤查詢

聚集索引不使用書籤查詢

我的理解:

聚集索引:把書裡面的內容放到書籤裡面,指定了聚集索引表列的所有內容(整行記錄)先放到書籤裡面

查詢:當查詢的時候根據書籤目錄,直接查詢書籤,因為內容直接存放在書籤裡面,所以查詢速度很快

修改資料:但是如果要修改資料,那麼,資料庫先找到書籤,然後修改書籤裡面的內容,再根據書籤裡的內容找到書本的內容,然後修改書本裡的內容(即要修改兩次)

因為書本裡的內容也存放在書籤裡面

非聚集索引:書裡面的內容不放到書籤裡面,只放指標

查詢:資料庫先找到書籤,再根據書籤裡的內容找到書本裡的內容,所以比聚集索引慢,但是因為跟聚集索引一樣加了書籤,所以比沒有加索引的表查詢快

修改資料:資料庫先找到書籤,再根據書籤裡的內容找到書本的內容,然後修改書本裡的內容,因為書籤裡不存放書本裡的內容,所以修改速度比聚集索引快

發現聚集索引還有乙個好處:就是比起非聚集索引,阻塞機率比非聚集索引少

比如:我有兩張表: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上

這句話更加論證了我的觀點:

聚集索引:把書裡面的內容放到書籤裡面,指定了聚集索引表列的所有內容(整行記錄)先放到書籤裡面

非聚集索引:書裡面的內容不放到書籤裡面,只放指標

因為書中的例子用乙個聚集索引表跟乙個非聚集索引表做插入操作,比較了非聚集索引跟非聚集索引做插入操作要申請的鎖

有興趣的朋友可以看一下這本書!!

SQL SERVER 書籤查詢

當優化器所選擇的非聚簇索引只包含查詢請求的一部分欄位時,就需要乙個查詢 lookup 來檢索其他欄位來滿足請求。對乙個有聚簇索引的表來說是乙個鍵查詢 key lookup 對乙個堆表來說是乙個rid查詢 rid lookup 這種查詢即是 書籤查詢。書籤查詢根據索引的行定位器從表中讀取資料。故此,除...

效能優化 找到SQL SERVER中的書籤查詢

我們在建立索引的時候,對於調節篩選列是大家都能夠注意到的。但是對於包含列檢查會被忽略。從而導致大量的lookup 也就是書籤查詢。那麼我如何才能找出某個表是不是執行了書籤查詢,執行了多少次書籤查詢呢?好訊息是,sql server 有各種各樣的動態管理檢視,其中 sys.dm db index op...

SQL中如何避免書籤查詢

1 使用聚集索引 對於聚集索引,索引的葉子頁面和表的資料頁面相同。因此,當讀取聚集索引鍵列的值時,資料引擎可以讀取其他列的值而不需要任何導航。例如前面的區間資料查詢的操作,sqlserver通過b樹結構進行查詢是非常快速的。把非聚集索引轉換為乙個聚集索引說起來很簡單。但是,這個例子和大部分可能遇到的...