今晚在網上又看了一下書籤查詢
聚集索引不使用書籤查詢
我的理解:
聚集索引:把書裡面的內容放到書籤裡面,指定了聚集索引表列的所有內容(整行記錄)先放到書籤裡面
查詢:當查詢的時候根據書籤目錄,直接查詢書籤,因為內容直接存放在書籤裡面,所以查詢速度很快
修改資料:但是如果要修改資料,那麼,資料庫先找到書籤,然後修改書籤裡面的內容,再根據書籤裡的內容找到書本的內容,然後修改書本裡的內容(即要修改兩次)
因為書本裡的內容也存放在書籤裡面
非聚集索引:書裡面的內容不放到書籤裡面,只放指標
查詢:資料庫先找到書籤,再根據書籤裡的內容找到書本裡的內容,所以比聚集索引慢,但是因為跟聚集索引一樣加了書籤,所以比沒有加索引的表查詢快
修改資料:資料庫先找到書籤,再根據書籤裡的內容找到書本的內容,然後修改書本裡的內容,因為書籤裡不存放書本裡的內容,所以修改速度比聚集索引快
發現聚集索引還有乙個好處:就是比起非聚集索引,阻塞機率比非聚集索引少
比如:我有兩張表: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樹結構進行查詢是非常快速的。把非聚集索引轉換為乙個聚集索引說起來很簡單。但是,這個例子和大部分可能遇到的...